An early Ross Barkley goal at the Etihad Stadium put Everton in sight of a Wembley date with rivals Liverpool but City replied through Fernandinho.
Controversy then erupted as Raheem Sterling then appeared to take the ball out of play before teeing up substitute Kevin De Bruyne to level the tie, but Sergio Aguero completed City's fightback.
The major downside for title-chasing City was the loss of the influential De Bruyne through injury late on, with the Belgian carried off after appearing to get his studs caught in the turf.
That took the shine off City's achievement but the team could still reflect on an excellent comeback after a compelling cup tie.
After their late push to sell tickets, City tried to stoke up the atmosphere with loud pyrotechnics while fans brought out their 1980s throwback inflatable bananas in their hundreds.
City controlled the majority of possession but Everton looked dangerous on the counter-attack.
It was from such a break the visitors took the lead after 18 minutes
As Aguero appealed for a foul after a tumbling under a Ramiro Funes Mori challenge, Everton quickly surged forward and fed the dangerous Barkley.
City had begun with Yaya Toure playing deep at the base of a midfield diamond, but the Ivorian was caught out of position as Barkley raced into space
Nicolas Otamendi was also outpaced as Barkley reached the edge of the area and fired a low shot past Willy Caballero, the City goalkeeping choice in cup football.
Trailing 3-1 on aggregate, City needed to respond and did so quickly
They looked to supply Aguero at every opportunity and David Silva found him with a clever flick
The Argentinian's long-range shot was blocked but Fernandinho followed up and fired home via a deflection off Leighton Baines.
Aguero rattled the post with a ferocious effort soon after and Joel Robles produced a brilliant reflex save as Silva pounced on Phil Jagielka's failed clearance.
The contest was a gripping and entertaining one and the pace was maintained after the break as Barkley broke clear and tested Caballero before Aguero got into position, only to miskick.
Silva became the second City player to hit the woodwork when he headed against the post from a Pablo Zabaleta cross and Toure could not quite reach the rebound.
Everton began to look like a team clinging on as Aguero almost turned in a cross from Sterling and the latter then had a shot blocked.
The goal City's play warranted, and levelled the tie, came after 70 minutes - but with a huge slice of controversy.
Sterling appeared to do well as he reached the byline to cross for substitute De Bruyne to rifle home - but the ball had gone out of play before it was pulled back by the England forward
None of the officials spotted it and Everton were left to rue their luck.
After being controversially denied a penalty in the first leg - while Sterling himself had a strong shout for a spot-kick turned down in the league match between the clubs a fortnight ago - City took full advantage.
Six minutes later Aguero put City ahead on aggregate with a superb glancing header from a pinpoint De Bruyne cross.
The tension was evident in the closing minutes as players from both sides flew into tackles but City held on, although the loss of De Bruyne was a late blow.