Tim Cahill's goal earned Millwall their first-ever FA Cup final appearance at the expense of 10-man Sunderland.
Cahill calmly sidefooted home the loose ball after Paul Ifill's 26th-minute shot was parried to settle a tense tie.
Sunderland had already come desperately close when John Oster's free-kick struck the underside of the crossbar.
The Black Cats turned up the pressure after the break, and in a rousing finale Jason McAteer was sent off and Matt Piper saw a goalbound shot saved.
The win means Millwall will play Manchester United in the FA Cup final on 22 May, and all but guarantees European football for the Lions next season.
The London side had the better of a frantic opening, but Sunderland were closest to making an early breakthrough.
7 mins: Oster hits bar
12 mins: Harris strike ruled out
26 mins: Cahill scores
85 mins: McAteer sent off
Oster's free-kick from 18 yards beat Andy Marshall in Millwall's goal, but crashed off the underside of the bar and bounced out to safety.
Minutes later, Oster was only narrowly wide with a ferocious volley after Tommy Smith's astute knock-down.
Millwall's Neil Harris put the ball in the net from close range shortly afterwards, but the goal was disallowed as he had strayed marginally offside.
The game settled down, but shortly after McAteer blazed over following an incisive Oster pass, Millwall went up the field and took the lead.
Sunderland's George McCartney underhit a pass to Phil Babb and Ifill latched on to the ball.
The midfielder cut inside and shot only for Mart Poom to save - but the ball fell to Cahill who calmly sidefooted home via a deflection off McCartney.
Ifill, the creator of the goal, celebrated but his game was over minutes later after he overstretched for a loose ball and was replaced by Peter Sweeney.
Tempers began to boil, and McAteer was booked after clumsily clattering into Kevin Muscat.
Dennis Wise saw his resulting free-kick deflected inches wide by the head of Julio Arca, and had another shot blocked.
And Muscat then became the second Millwall player forced off by injury in the first half after he collided with McCartney - who was booked for the challenge.
Arca slammed the ball into the side netting in first-half injury time as Sunderland finished with a flourish.
And they picked up the pace even more with a flurry of chances after the interval.
Kevin Kyle lashed the ball just wide after a scramble in the Millwall box, and the same player came even closer a minute later with a header that Marshall was at full stretch to tip away.
Millwall were on the back foot, and Arca blazed wildly over from 12 yards as the ball broke in another goalmouth scramble.
But the London side came back and blunted Sunderland's cutting edge.
And they almost doubled their advantage on 75 minutes as Cahill was sent clear down the right, and supplied a great cross for Danny Dichio, but Poom was alert to block the danger, and Harris' follow-up shot was blocked.
Sunderland still threatened, and Cahill had to head a speculative Gary Breen shot to safety.
McCartney came desperately close with six minutes remaining, latching on to a pass with the Millwall defence snoozing, but he curled a left-foot shot inches wide.
Piper forced a tremendous save from Lawrence in the dying seconds in a tremendous finish, but it was not enough for Sunderland.
Sunderland: Poom, McCartney, Babb (Piper 77), Breen, Wright (Thornton 90), Arca, Thirlwell, McAteer, Oster, Kyle (Stewart 61), Smith.
Subs Not Used: Williams, Myhre.
Sent Off: McAteer (86).
Booked: McAteer, McCartney, Thirlwell.
Millwall: Marshall, Lawrence, Muscat (Roberts 42), Ward, Livermore, Cahill, Wise, Ifill (Sweeney 29), Dichio, Ryan (Elliott 56), Harris.
Subs Not Used: Gueret, Chadwick.
Booked: Ifill, Wise.
Referee: P Durkin (Dorset).