Giulio Migliaccio and a Cesare Bovo penalty gave the Sicilians a 2-1 win on the night in the semi-final, second leg and 4-3 aggregate success following a 2-2 draw in Milan three weeks ago.
Zlatan Ibrahimovic pulled a goal back for Milan deep into injury time.
Palermo will face either holders Inter Milan or Roma in the final on May 29, in what will be their third Cup final.
Both sides finished the game with 10 men after the game exploded into life in a combustible second period.
Milan for their part looked jaded, as if they had spent too long celebrating their Serie A title success on Saturday night.
In a tight first half of few chances, Robinho wasted a glorious early opportunity when left all alone only to shoot over on three minutes.
Milan midfielder Mathieu Flamini was next to try his luck but from an impossibly tight angle with goalkeeper Salvatore Sirigu blocking at his near post.
Palermo's best chance in the opening period came on the quarter hour mark when playmaker Javier Pastore thrashed an effort high and wide.
Milan had another sight of goal five minutes after the restart but after digging the ball out from under his feet, Pato dragged his shot wide.
Palermo started to up the ante and took a deserved lead on 63 minutes after their pressure forced a corner.
Migliaccio made a determined run into the box and evaded his marker to plant a diving header into the bottom corner.
Milan coach Massimiliano Allegri responded by bringing on star forward Ibrahimovic for midfield veteran Clarence Seedorf.
But their hopes of reaching the final suffered a fatal blow 17 minutes from time when hardman Dutch midfielder Mark van Bommel was sent off for bringing down Josip Ilicic when the Slovenian was clean through in the box.
Bovo made no mistake from the spot kick but TV replays suggested Ilicic needed no second invitation to go down as Van Bommel had barely tugged his shirt.
Palermo needed only to see out the remaining time but Bovo immediately wiped out their numerical advantage by getting himself sent off for a high boot that caught Pato in the face.
Allegri then threw on Antonio Cassano for centre-back Alessandro Nesta and played four up front.
And they were give a late lifeline when Ibrahimovic ran onto Cassano's deflected pass and clipped home four minutes into injury time but it was too little, too late.