Both sides struggled for fluency in a cagey first half. Everton had to do more defensively but arguably had the better of the chances, while Manchester City saw a lot of the ball but failed to trouble the opposition.
The game proceeded in the same fashion in the second half and seemed to be destined for extra time when Ilkay Gundogan popped up with the opener in the 84th minute.
With Everton pushing up the pitch in pursuit of an equaliser, they left space in behind for Kevin de Bruyne to exploit. The Belgian settled the tie by firing a powerful left-footed strike into the bottom corner.
Despite leaving it late, the league leaders sealed their place in the FA Cup semi-finals for the third straight season, doing so for the first time in nine decades.
Meanwhile, Everton are left to compete for a European place as the Premier League season enters its final stretch.
On that note, let's have a look at the Manchester City player ratings.
Zack Steffen: 5/10
Manchester City’s stand-in keeper had hardly any saves of note to make. He did cause his side a few moments of concern, as he was indecisive with the ball at his feet.
Kyle Walker: 5/10
The Manchester City right-back had little to do defensively. Kyle Walker did not offer much in offence either, giving the ball away sloppily on occasion.
Ruben Dias: 5/10
Ruben Dias was forced into some clumsy fouls by Richarlison and Dominic Calvert-Lewin on the rare occasions Everton ventured forward with numbers. But it was otherwise an impressive outing for the Portuguese.
Aymeric Laporte: 6/10
Largely untroubled in the heart of the Manchester City defence, Aymeric Laporte was able to repel Everton's attacks with relative ease.
The Frenchman was allowed a lot of time on the ball throughout the game as Everton did not press the Manchester City backline. Laporte also played a huge part in bringing the ball high up the pitch in the buildup to one of Manchester City's goals on the night.
Oleksandr Zinchenko: 5/10
The Ukrainian carried out his defensive responsibilities well, including making a goalline clearance from a first-half corner. The Manchester City left-back was also a willing runner down the flank but did not cause the Everton defence too many problems going forward.
The Brazilian international essayed the role of a central defensive midfielder with assuredness and experience. Fernandinho brought some much-needed calmness and quality to the side.
Ilkay Gundogan: 7/10
The more mobile of Manchester City’s central midfield partnership, Ilkay Gundogan was heavily involved in his side's attacking moves and was always an option in and around the Everton box.
As has regularly been the case since the turn of the year, the German found himself in the right place at the right time to head home into an unguarded net to give his side the lead.
Bernardo Silva: 5/10
Replaced just after the hour mark after a typically all-energy display, Bernardo Silva was full of running, popping up in positions in the final third without offering too much of an attacking threat.
Phil Foden: 6/10
The youngster regularly swapped positions with Bernardo Silva, alternately attacking from the right or through the middle. Phil Foden looked dangerous whenever he was on the ball.
Raheem Sterling: 5/10
Restored to the Manchester City starting lineup after being left out for three games, Raheem Sterling got into a few good positions from his left-wing role. But his shots lacked clinicality, as did his passing and shooting.
Gabriel Jesus: 5/10
It was a largely anonymous display from the Brazilian, as Gabriel Jesus was kept quiet by Everton’s three centre-backs and was not allowed much time on the ball.
Ratings of Manchester City Substitutes:
Riyad Mahrez: 4/10
Riyad Mahrez replaced Bernardo Silva just after the hour mark as Guardiola looked to freshen up his lacklustre attacking forces. But the Algerian did not get the opportunity to showcase his trademark silky skills.
Kevin De Bruyne: 7/10
It was a sparkling cameo from the Belgian. Kevin De Bruyne came on for the final ten minutes and played a part in the first goal before sealing his team's victory by bagging the second.
It was a short but profitable cameo for the Spaniard. Rodri's only contribution of note after coming on in the 90th minute was to set up Kevin De Bruyne for Manchester City's second goal.