Rodrygo gave the visitors an early lead before Kevin De Bruyne hit back for the holders to leave the match level at 1-1 on the night and 4-4 on aggregate. However, City’s defence of the competition came to an end after Bernardo Silva and Mateo Kovacic saw spot-kicks saved by Madrid’s unlikely hero Andriy Lunin.
The Ukrainian, who has deputised this season for the injured Thibaut Courtois, had been at fault for City’s early opener in a thrilling first leg but more than made amends. City had not lost at home in the Champions League since 2018 but the holders were held at bay by a heroic defensive effort by the 14-time European champions despite having 34 attempts on goal.
Madrid were blown away by an early City blitz in a 4-0 defeat at the Etihad 11 months ago as Pep Guardiola’s men went on to win the competition for the first time. City also edged a semi-final first leg thriller 4-3 on home soil two years ago only to be stunned by a late Madrid fightback in the return leg. This time Carlo Ancelotti’s men flipped the script with an assured start that was rewarded in the opening goal.
Jude Bellingham plucked the ball out of the sky with an immaculate touch to set Real roaming down the right. Vinicius Junior picked out the unmarked Rodrygo and he tapped in the rebound after his first effort was parried by Brazilian international teammate Ederson. If City were slow to warm to their task they quickly had Madrid penned against the ropes but failed to land a telling blow for 76 minutes.
Erling Haaland failed to score for a fourth consecutive clash between the sides but has rarely come up closer than when his looping header came back off the crossbar and left Bernardo Silva no time to adjust to turn in the rebound. Lunin was forced to turn behind De Bruyne’s shot from outside the box and the tenacious Antonio Rudiger deflected Jack Grealish’s effort into the side-netting.
The Madrid goalkeeper saved two more from Grealish at the start of the second half before Guardiola sacrificed the England international for the extra pace of Jeremy Doku. That proved an inspired change as Rudiger failed to deal with a Doku cross and presented the ball perfectly for De Bruyne to smash into the roof of the net 14 minutes from time.
De Bruyne should have turned the tie around single-handedly as he then blazed a glorious chance over. However, City’s dominance of the ball and territory did serve to sap Madrid’s energy as their lethal counter-attack was largely subdued after the first half. Guardiola made another big call as Julian Alvarez replaced Haaland for extra-time.
But the Argentine was no more effective at picking holes in the mass ranks of Madrid defence as it was Real who had the best chance of the extra 30 minutes. Rudiger sliced over with a clear sight of goal after staying forward from a rare Madrid corner.