Arsenal and Bayern Munich booked their places in the Champions League semi-finals on Wednesday night, but in dramatically contrasting fashion—one through grit and control, the other via a chaotic, last-gasp comeback.

At the Emirates, Arsenal edged past Sporting CP with a 0-0 draw to secure a 1-0 aggregate victory, reaching the semi-finals for the second consecutive season under Mikel Arteta.

It was far from a vintage attacking display. Arsenal relied on the advantage earned in Lisbon through Kai Havertz’s stoppage-time winner and were largely contained by a disciplined Sporting side. The visitors came closest to scoring when Geny Catamo struck the post just before halftime, while substitute Leandro Trossard also hit the woodwork late on.

Despite managing only one shot on target, Arsenal’s defensive solidity proved decisive, recording their eighth clean sheet in 12 Champions League matches. They now face Atletico Madrid in the semi-finals.

“This was a really tough test over two games,” captain Declan Rice said. “To reach back-to-back semi-finals is an amazing achievement, and now we want to go one step further.”

Arteta echoed that sentiment, praising his side’s control in the closing stages and calling the occasion “a great night” for the club, while acknowledging improvements will be needed if they are to surpass last season’s semi-final exit to Paris Saint-Germain.

There was also concern ahead of their crucial Premier League clash with Manchester City after Noni Madueke limped off with a knee issue.

Sporting coach Rui Borges felt his side deserved more. “In both games the best opportunities were Sporting’s,” he said. “There can only be pride.”

While Arsenal ground their way through, Bayern Munich delivered one of the competition’s most dramatic nights, to advance 6-4 on aggregate in a pulsating encounter.

Late goals from Luis Díaz in the 89th minute and Michael Olise in stoppage time sealed a famous comeback for the German side, who will now meet holders Paris Saint-Germain in the semi-finals.

“It was a great night for the club,” said Bayern coach Vincent Kompany. “We showed absolute belief and togetherness to fight our way back.”

The match exploded into life almost immediately when 40-year-old goalkeeper Manuel Neuer gifted an early goal to Arda Güler after just 35 seconds. Bayern responded through Aleksandar Pavlovic before Güler struck again with a superb free kick.

Harry Kane equalised for Bayern, only for Kylian Mbappé—set up by Vinícius Júnior—to restore Real’s lead in a breathless first half.

The tempo dipped after the break, but the decisive moment came when Eduardo Camavinga was sent off in the 86th minute. Bayern capitalised immediately, with Díaz’s deflected effort followed by Olise’s stoppage-time strike to complete the turnaround.

Real’s frustration boiled over as Güler was also dismissed after the final whistle, while coach Álvaro Arbeloa criticised the red card decision. “It’s a shame to spoil such a beautiful game,” he said.

The defeat ends Real Madrid’s hopes of a record-extending 16th European title this season, while Bayern—six-time champions—continue their pursuit of a treble.