Fernando’s own-goal, as he deflected Gareth Bale’s cross-shot into his own net, was reward for Madrid’s first half dominance.
Even after the break City never really looked likely to threaten, with a half-fit looking Cristiano Ronaldo passing up a host of chances and Bale hitting the crossbar with a header.
Zinedine Zidane’s side were far from their best but they now go through to their 18th European Cup / Champions League final — where they will face Atletico Madrid in Milan on Saturday May 28 in a rematch of the decider Los Blancos won in such dramatic circumstances two years ago.
“We did not deserve to lose this game. It was similar to the first leg, Fernandinho hit the post, but neither team had clear chances,” said City boss Manuel Pellegrini.
“Neither of the two teams deserved to win the game. There was a lot of work from both teams, but very little football.
“I did not see Madrid superior to us — we pressed them well, but with ball we lacked creativity to do them damage.”
After a fiery pre-game greeting for both teams, Ronaldo, who Zidane claimed was 100% fit on Tuesday, returned after two weeks out injured.
Young Spaniards Jese Rodriguez and Isco were chosen in the XI in place of the injured Karim Benzema and Casemiro.
For City, coach Pellegrini recalled fit again Yaya Toure to his line-up. The visitors started positively but they suffered a blow less than 10 minutes in, when team captain Vincent Kompany limped off, being replaced by Eliaquim Mangala.
Madrid gradually took control of the game, with creative midfielders Isco and Luka Modric regularly finding space to pick their passes. The Croatia international freed right-back Dani Carvajal, and his cross was headed just too high by Ronaldo.
Los Blancos were getting plenty of joy down that wing, and both Modric and Carvajal were involved as Madrid opened the scoring on 20 minutes.
Bale easily found space between City defenders Gael Clichy and Mangala, and the Welshman’s right-footed cross came off Fernando and nestled in the far top corner.
City needed to respond, but they struggled to find a way into the game, with Toure looking off the pace in midfield. At one point the ex-Barcelona midfielder appeared to stand and watch as Isco, eight years younger, stopped, had a think, changed direction and scurried away outside his own box. Madrid skipper Sergio Ramos bundled the ball to the net after a free-kick, but Slovakian referee Damir Skomina ruled Pepe had been offside.
The visitors did wake up just before half-time. Kevin De Bruyne roamed infield from the left-wing, found space, and picked out Fernandinho, whose 20 yarder hit the outside of the post.
After the break, City had to come out more, but Madrid were having the better chances on the break. Two superb Bale passes set up a pair of excellent chances — but Ronaldo swung and missed, and Hart saved from Modric. The not very mobile Portuguese was at centre-forward now, and tested the England keeper with a far post header and 15 yard snap shot.
Bale came closest as his fine header from a corner hit the angle of post and bar. As another cross came back in Ronaldo’s growing desperation for a goal was shown by him slapping the ball to the net, but Skomina spotted it.
As time ticked by, and Madrid chances went a-begging, it seemed unbelievable that City were still just one goal away from going through. Substitutes Raheem Sterling and teenager Kelechi Iheanacho came on, but little changed. Aguero sent a 20 yarder onto the roof of the net on 89 minutes, the closest City came all game. With the Bernabeu getting nervous, home goalkeeper Keylor Navas flew off his line and headed the ball clear.
City did not deserve anything though. Toure looked past it, while De Bruyne was rarely able to get into the game, and Aguero was totally dominated by Ramos and Pepe. City looked stale and tired, as their Premier League travails have shown, and the summer will surely bring a huge rebuilding job overseen by incoming coach Pep Guardiola.
Zidane’s Madrid did not play too much sparkling football tonight, but they move on to the final against their city rivals Atletico — in what will be yet another all La Liga European final.
Navas 7; Carvajal 8, Pepe 7, Ramos 7, Marcelo 6; Modric 9, Kroos 7, Isco 8; Bale 9, Jese 7, Ronaldo 6.
Lucas Vazquez 6, James 6, Kovacic N/A
Hart 7; Sagna 6, Otamendi 6, Kompany [N/A], Clichy 5; Fernando 5, Fernandinho 6; Navas 6, Toure 4, De Bruyne 6; Aguero 6.
Mangala 5, Sterling 5, Iheanacho 5
Damir Skomina (Slovakia).