Real Madrid are through to a fourth UEFA Champions League final in five years as they hung on against an impressive Bayern Munich to win 4-3 on aggregate after an exhilarating second leg.

Joshua Kimmich gave the German champions the perfect start with an early goal, although Karim Benzema struck back quickly, before capitalising on a major howler from Sven Ulreich to put them further ahead in the tie after half-time.

James Rodríguez gave Bayern hope with just over 25 minutes left, but despite putting plenty of pressure on their hosts, they succumbed to a fourth semi-final exit since winning the competition in 2013.

Kimmich and Benema score early on

Real, the 12-time winners looking to win the competition for the third year in the row, had got the better of Bayern in a scrappy first leg, winning 2-1 at the Allianz Arena. 21 of the 22 players that ended that match started here, with the fit-again David Alaba replacing Rafinha. Niklas Süle, Corentin Tolisso and Thiago also came into the Bayern team that started last week, with Mateo Kovacic, surprisingly in for Casemiro, Marco Ascensio and Benzema all in for Madrid.

Bayern needed to score two here because of the away goals rule, and it took them just three minutes to find the first of those. Mats Hummels built it from the back, the ball passing through Franck Ribéry and Robert Lewandowski to Thomas Müller. Sergio Ramos got into mess trying to clear his cross, and Kimmich was there to pounce on and score with the loose ball, adding to his opening goal from the first leg.

Despite that early setback, Zinedine Zidane’s men were soon back on level terms on the night, and ahead outright on aggregate. Kovacic went over the top with an excellent diagonal ball to pick out Marcelo on the left wing. He got the better of Kimmich to get the cross in, getting past Ulreich at his near post, allowing Benzema an easy header into the open net.

No more goals but first half remains gripping

Bayern remained more assured in their performance than last week, despite conceding. They assaulted the Real box with balls into the box, especially from the left where Alaba was clearly targeting the unnatural right-back Lucas Vázquez, although his teammates were able to keep Bayern just about at bay. At the other end, a solo effort from Ronaldo was well off the mark, although a later effort needing saving by Ulreich, who had also denied Marcelo.

The Germans had the better opportunities though, being a much more dangerous force than last Wednesday. After a Ribéry run into the box, Müller on the turn had his shot saved by Keylor Navas, who then denied Lewandowski after a Hummels ball to him. The rebound was headed by Müller to Rodríguez, who fired over.

Just before the break, Tolisso then curled an effort wide, before a cross from Kimmich hit the hand of Marcelo. No penalty was given, but his hand had been held out. Given the focus on the selection of Cüneyt Cakir before the match, with accusations of bias towards the hosts, that was one for Bayern fans to chew over during the break.

Ulreich error gives Bayern a mountain to climb

A moment of calamity for Ulreich just 20 seconds into the second half came as a bitter blow for Bayern. Tolisso had the ball on his right, but surrounded by three white shirts, he passed back to Ulreich. He was caught into two minds though, going to ground and not sure whether to use his hands or his feet, and ended up allowing the ball to go straight past him. Benzema wouldn’t have believed his luck as he put his side 2-1 up on the night, leaving Bayern needing two.

The score line was a harsh reflection of their performance but Bayern responded admirably. Alaba came inside from the left and Navas did well to turn his deflected shot wide. Bayern then had another shout for a penalty denied when Ramos barged into Lewandowski – another one for the conspiracy theorists. Real looked to catch them on the counter meanwhile, with a Luka Modric cross going unmet before a massive chance for Ronaldo, yet somehow he put it over from inches out.

Bayern were still going for it and they were rewarded for their efforts. Kimmich combined on the right with Süle who had strayed forward, and his cross was a good one, finding Rodríguez. His initial shot was blocked by Raphaël Varane, and although the rebound forced him into a tighter angle, he managed to shoot it through Navas to score against the club that stills owns him. With that in mind, he chose not to celebrate, but it was a massive goal for his current side.

Bayern’s heroic efforts not enough

Having been the better team for much of this game they deserved more than a 2-2 draw out of it and they kept plugging away at finding the goal to send them into the final. A dink into the box by Ribéry found Rodríguez, however a vital block from Varane saw his shot deflect towards Navas, who then scrambled away a Müller header from yet another Alaba cross.

Süle had also made a vital interception to deny Ronaldo a chance on goal to keep his side in it. Gareth Bale, who had replaced Benzema, did get through on goal though, but was doubly denied, as Ulreich did well to save and the Welshman was then given offside in any case. It would be backs-to-the-wall for the Spaniards from then on.

Navas did well to punch away a Thiago free-kick, and as the game ticked into stoppage time Hummels headed wide a Thiago corner before then seeing an attempted ball in the box for Lewandowski deflect into the grateful hands of Real’s Costa Rican goalkeeper. They kept pushing, and pushing, and with the final kick of the game a long ball from Süle was aimed at Müller in the box, but he couldn’t connect.

Real had thus held on for a third consecutive final, and a fourth in five years, as they continue their pursuit of a 13th European Cup title and a third-in-a-row under Zidane. Bayern have now lost in their last four semi-final appearances, and have been knocked out by Spanish sides every year since beating Borussia Dortmund at Wembley in the 2013 final. They will feel bitter after a huge effort, but wastefulness in front of goal and individual errors across both legs have cost them dear.