Joaquin Correa scored the only goal of the two-legged tie shortly before the hour mark to send Lazio through to the final against either Atalanta or Fiorentina.
Milan has won just one of its past seven matches in all competition and risks slipping out of the Champions League qualifying positions in Serie A.
"We were embarrassing, we have to take responsibility," Milan coach Gennaro Gattuso said. "It’s a bad period for us but we have to turn the page.
"Tonight hardly anything worked, we struggled in attack and in defence … all in all it was a performance to forget."
Lazio dominated the match at San Siro and Milan had goalkeeper Pepe Reina to thank for keeping the scoreline down.
"It’s a great achievement," Lazio coach Simone Inzaghi said. "We fully deserved to win. The best player on the pitch was Reina, (Lazio goalkeeper Thomas) Strakosha didn’t even make a save."
The first leg had ended scoreless and there was a lot of tension following Milan’s recent 1-0 win over Lazio in the league.
Both sides had chances in the first half but the deadlock was finally broken following a Milan corner, which ended with Lazio going on the counterattack and Ciro Immobile setting up Correa to fire into the bottom left corner.
Milan pressed hard for an equalizer and Patrick Cutrone had the ball in the back of the net but it was disallowed for offside.