Manuel Pellegrini’s men, who are now nine points clear of Liverpool in fifth, were handed the perfect start when Brad Guzan horribly miskicked Ron Vlaar’s back pass straight to Sergio Aguero, who tapped home into an empty net from close range.
City doubled their advantage in the 66th minute when Aleksandar Kolarov took advantage of a poor Villa wall to bend a free-kick past Guzan but the visitors struck back almost immediately thanks to Tom Cleverley’s strike.
Villa looked like grabbing a vital point in the fight for survival when Carlos Sanchez steered the ball home in the 85th minute – and they thought they should have had a penalty just minutes later when Christian Benteke was tripped in the penalty box by Joe Hart.
But City were rescued by a controversial offside flag and then Fernandinho popped up with just one minute of normal time remaining to fire a the late winner to send them nine points behind the leaders Chelsea, who play Arsenal on Sunday.
It was heartbreak for Tim Sherwood and his side, who are now just two points above the relegation zone with four games remaining.
It was a sedate opening in Manchester and there was not much noise coming from the home fans but that immediately changed in the fourth minute as Guzan’s terrible attempt at a clearance from Ron Vlaar’s back pass gifted Aguero the opening goal of the game.
It was the perfect start for Pellegrini’s men and a moment Guzan, who was left out of last weekend’s FA Cup semi-final, will want to forget as Villa struggled to get going following their FA Cup heroics.
Minutes later Yaya Toure split open the visitor’s defence, playing Jesus Navas in behind but the Spaniard’s cross was well cut out with Aguero waiting to pounce.
In the 17th minute, the hapless Guzan was again in the thick of the action as he missed Kolarov’s free-kick but Fernando could not capitalise, steering his header wide of the target.
Sherwood would have warned his troops about an FA Cup hangover before the game but the message clearly did not get through to his players as Aguero latched onto Leandro Bacuna’s horror back pass. The Argentina international cut back on his right foot but Jores Okore was well placed to make a vital intervention.
Villa were lucky to be just one behind but they finally clicked into gear after 27 minutes and should have been level as the ricocheted into the path of Christian Benteke, but his shot was smartly saved by Joe Hart.
With half-time approaching Villa were starting to put City under serious pressure as Jack Grealish and Fabian Delph got into the game, however, they could not take advantage with Benteke heading over from close range from Kieran Richardson’s cross.
City were forced into a change at the break when Toure, who picked up a knock in a challenge with Delph just before the break, was replaced by Fernandinho and the home side looked to put Villa on the back foot as Navas’ cross just evaded Frank Lampard.
However, Sherwood’s men were not backing down as Benteke combined with Grealish to create an opening for Delph, but the England midfielder’s shot sailed inches wide of the far post.
Pellegrini sent for James Milner, who replaced the ineffectual Lampard, as City tried to grab a foothold in the game and they finally doubled their advantage when Kolarov’s pin-point free-kick nestled into the back of the net.
The home fans could have been forgiven for thinking all three points were in the bag but Villa responded just minutes later after Hart flapped at a long ball and Cleverley was on hand to score his first goal for Villa.
The turnaround was complete when Hart’s attempted clearance from Delph’s corner fell to Sanchez, who stroked the ball into the back of the net with just five minutes remaining.
City could even have lost the game and were thankful for a dubious offside flag against Benteke before he was tripped in the penalty box by Hart.
However, it was Villa’s turn to think they had snatched a vital point in the fight for Premier League survival but there was time for one final piece of drama as the ball fell to substitute Fernandinho, who scissor-kicked the ball past Guzan to seal all three points and send City a step closer to Champions League qualification.
Man City: Hart (5), Zabaleta (6), Demichelis (6), Mangala (6), Kolarov (7), Fernando (6), Lampard (5), Navas (7), Yaya Toure (5), Silva (6), Aguero (7).
Subs used: Fernandinho (7), Milner (6), Bony (5)
Aston Villa: Guzan (4), Bacuna (6), Okore (6), Vlaar (6), Richardson (6), Sanchez (7), Westwood (6), Cleverley (7), Delph (7), Grealish (7), Benteke (7).
Subs used: N’Zogbia (6), Lowton (5).
Man of the Match: Christian Benteke