Holders Spain beat the Netherlands on penalties after a dramatic quarter-final second leg in Valencia finished 3-3 Sunday to set up a Nations League last-four clash with France, who edged Croatia in a shoot-out after a 2-2 aggregate draw.
On a dramatic night, Portugal battled past Denmark in extra time and will next face finals hosts Germany after their tense 5-4 aggregate victory over Italy.
European champions Spain took the lead in the tie, after Thursday's 2-2 first-leg draw, when Mikel Oyarzabal picked himself up after being fouled in the box to slot home an early penalty.
The Netherlands equalised nine minutes into the second half as Memphis Depay also won and then netted a spot-kick.
Oyarzabal grabbed his second in the 67th minute after a strong run forward by Nico Williams, only for the Dutch to level again with 11 minutes remaining through Ian Maatsen's fierce strike.
Lamine Yamal struck shortly before the interval in extra time, though, curling the ball into the far corner after a couple of superb touches.
There was yet another twist as Spain goalkeeper Unai Simon brought down Xavi Simons, who picked himself up to score.
Spain edged home 5-4 in the shoot-out despite a miss from Yamal, as Simon saved from the Netherlands winger Donyell Malen and Pedri Gonzalez struck the winning penalty.
"We're Spain and we don't have to fear anyone," Pedri told TVE of facing 2021 Nations League winners France in the semi-finals in Stuttgart on June 5.
France wiped out a two-goal deficit against Croatia at Stade de France.
Michael Olise's brilliant free-kick broke the deadlock on the night in the 52nd minute, before Ousmane Dembele swept Olise's cutback into the bottom corner to send the quarter-final to extra time.
Theo Hernandez missed a penalty to win it for France in an eventful shoot-out, but Dayot Upamecano eventually secured a 5-4 success on penalties in sudden death.
"We woke up thinking it could be a great night," Kylian Mbappe told TF1.
"We were convinced we were going to do something great."
Portugal, inspired by substitute Francisco Trincao, battled back after losing the first game 1-0 to win a thrilling last-eight encounter with Denmark 5-3 on aggregate.
Cristiano Ronaldo, after a stuttering run-up, produced the tamest of early penalties which was comfortably held by Denmark goalkeeper Kasper Schmeichel.
Portugal were gifted the lead on the night when Joachim Andersen put through his own net.
But the Danes restored their aggregate advantage 11 minutes into the second half through Rasmus Kristensen's excellent header.
Ronaldo did get his 136th international goal, though, turning the ball in after Schmeichel tipped Fernandes' shot against the post.
But Portugal were caught out in the 76th minute when Christian Eriksen tapped home.
The hosts managed to force an added half-hour when Schmeichel's weak punch fell to Mendes, who teed up Trincao to drill a shot into the bottom corner.
Trincao netted his second in the first minute of extra time and Goncalo Ramos secured a meeting with Germany in Munich on June 4.
Julian Nagelsmann's Germans survived an Italy comeback to win 5-4 on aggregate after a 3-3 draw in Dortmund.
Germany extended their overall advantage on the half-hour mark when Joshua Kimmich tucked home a spot-kick before playing a key role in a bizarre second goal.
Italy goalkeeper Gianluigi Donnarumma left his goal after making a save to complain at the referee and Kimmich took a quickly-taken corner which was flicked into an empty net by Jamal Musiala.
Tim Kleindienst nodded in Kimmich's clipped cross on the stroke of half-time, but Moise Kean scored twice to give Italy a glimmer of hope heading into the last 20 minutes.
Giacomo Raspadori converted a penalty in injury time to equalise on the night, but there was not long enough left for the Azzurri.
"A football game is never perfect, but it was some unbelievable football, and the best I've seen us play," Germany coach Nagelsmann said.
Elsewhere, Belgium narrowly avoided relegation to League B as two late goals from Romelu Lukaku helped them overturn a 3-1 first-leg deficit against the Ukraine with a 3-0 victory.
RESULTS
France 2 (Olise 52, Dembele 80) Croatia 0 aet
2-2 on aggregate; France won 5-4 on penalties
Germany 3 (Kimmich 30-P, Musiala 36, Kleindienst 45) Italy 3 (Kean 49, 69, Raspadori 90+5-P)
Germany won 5-4 on aggregate
Portugal 5 (Andersen 38-og, Ronaldo 72, Trincao 86, 91, Ramos 115) Denmark 2 (Kristensen 56, Eriksen 76) aet
Portugal won 5-3 on aggregate
Spain 3 (Oyarzabal 8-P, 67, Yamal 103) Netherlands 3 (Depay 54-P, Maatsen 79, Simons 109-P) aet
5-5 on aggregate; Spain won 5-4 on penalties
Belgium 3 (De Cuyper 70, Lukaku 75, 86) Ukraine 0
Belgium won 4-3 on aggregate
Hungary 0 Turkey 3 (Calhanoglu 37-P, Guler 39, Bardakci 90)
Turkey won 6-1 on aggregate
Scotland 0 Greece 3 (Konstantelias 20, Karetsas 42, Tzolis 46)
Greece won 3-1 on aggregate
Serbia 2 (Maksimovic 56, Vlahovic 90) Austria 0
Serbia won 3-1 on aggregate
Georgia 6 (Haroyan 4-og, Mikautadze 14, 35, Chakvetadze 23, Kiteishvili 27, Kvaratskhelia 62) Armenia 1 (Sevikyan 48)
Georgia won 9-1 on aggregate
Iceland 1 (Oskarsson 2) Kosovo 3 (Muriqi 35, 45+3, 79)
Kosovo won 5-2 on aggregate
Slovenia 1 (Cerin 95) Slovakia 0 aet
Slovenia won 1-0 on aggregate
Republic of Ireland 2 (Ferguson 63, Idah 84) Bulgaria 1 (Antov 30)
Ireland won 4-2 on aggregate