Aleksey Miranchuk scored the winner as 10-man Atalanta beat Lazio 3-2 in a thrilling Italian Cup quarter-final on Wednesday, while a much-changed Juventus eased past second-tier SPAL to also reach the last four.
A dramatic match in Bergamo saw five different goalscorers, a red card and a missed penalty as Atalanta came out on top in a rematch of the 2019 final, won 2-0 by Lazio.
"It was fun, wasn't it? A fascinating game, at times spectacular," Atalanta coach Gian Piero Gasperini told RAI Sport.
Atalanta, bidding to win only the second major trophy in their history and first since the 1963 Italian Cup, are now unbeaten in 14 matches in all competitions and will face either Napoli or Spezia, who play on Thursday, in the last four.
"Reaching the semi-final is a great achievement," added Gasperini.
"This is a competition we want to approach in the best possible way and to go as far as possible."
On Tuesday, Inter Milan won a bad-tempered derby against AC Milan and will face Juventus, who saw off second-tier SPAL 4-0, in the two-legged semi-finals, which will be played on February 3 and 10.
At the Gewiss Stadium, Albanian defender Berat Djimsiti gave Atalanta a seventh-minute lead after a goalmouth scramble which saw Lazio goalkeeper Pepe Reina save from Jose Luis Palomino.
The former Liverpool and Napoli stopper had to be alert to prevent Luis Muriel from doubling the advantage just a few minutes later.
But the visitors levelled in the 17th minute, as Kosovan Vedat Muriqi, making his 16th appearance for Lazio since joining from Fenerbahce, headed home Francesco Acerbi's cross to score his first goal for the capital club.
Centre-back Acerbi produced a magical moment to put Lazio ahead 11 minutes before the break, weaving past three defenders before prodding the ball into the net.
A breathless first half was capped in style as Ruslan Malinovsky drilled in an equaliser for Atalanta after good work from Muriel.
Atalanta's hopes of reaching the final suffered a blow just eight minutes into the second period, as Palomino was shown a straight red card for pushing Manuel Lazzari when the Lazio substitute was deemed to have a clear goalscoring opportunity.
But Gasperini's men made light of their man disadvantage, moving back in front in the 57th minute as Cristian Romero set Miranchuk free to score his second Cup goal of the season.
Gasperini signalled he wanted his side to keep attacking, though, sending on striker Duvan Zapata shortly after the goal.
The Colombian wasted little time in making an impact, winning a penalty for a foul by Wesley Hoedt, only to see his spot-kick held by Reina.
Lazio boss Simone Inzaghi responded to his team's reprieve by introducing top-scorer Ciro Immobile, but it was Acerbi who came closest to forcing extra time when his 89th-minute header was brilliantly saved by home 'keeper Pierluigi Gollini.
Juve cruise through
Juventus coach Andrea Pirlo made nine changes to the side which beat Bologna in Serie A on Sunday, with Cristiano Ronaldo rested from the matchday squad and goalkeeper Gianluigi Buffon starting the day before his 43rd birthday.
But the record 13-time winners still made short work of SPAL, the only lower-league team to make the quarter-finals this season.
Juve " who lost to Napoli on penalties in the final last term " took a controversial 16th-minute lead when Alvaro Morata scored a spot-kick which was awarded by VAR for a foul on Adrien Rabiot, despite little contact and the Frenchman being originally booked for diving.
Young full-back Gianluca Frabotta doubled the lead with his first senior goal after the half-hour mark.
Dejan Kulusevski put the result beyond doubt with 12 minutes remaining before substitute Federico Chiesa tapped home a fourth in injury time.