Reus netted twice before the break after Weidenfeller saved a Di Maria penalty but the German side couldn't find a third goal to go beyond Carlo Ancelotti's side
With a 3-0 first-leg advantage, Madrid were rocking at half-time as Marco Reus' double reduced the aggregate score to 3-2 in a fervent atmosphere at Signal Iduna Park on Tuesday.
Both goals came after Angel Di Maria had seen a penalty saved by Roman Weidenfeller, the Argentinian losing his footing on the wet surface as he went to strike the ball.
Two efforts from Reus - capitalising on mistakes from the visitors each time - gave Jurgen Klopp's side hope of a memorable fightback but they could not force the third goal that would have sent the tie into extra-time as Real gained a measure of revenge for last year's semi-final loss to Dortmund.
Carlo Ancelotti left Cristiano Ronaldo, struggling with a minor knee injury, on the bench for the duration of the game and Madrid just about managed in his absence, holding off a determined Dortmund in the final stages to book their place in the last four.
The visitors wasted a golden opportunity to practically wrap up the tie in the 17th minute, Weidenfeller diving to his left to keep out Di Maria's spot-kick after Lukasz Piszczek was adjudged to have handled Fabio Coentrao's cross.
Dortmund ought to have got themselves the early goal their fans craved two minutes later, Henrikh Mkhitaryan side-footing wide from 10 yards after being teed up by Reus.
However, Reus rendered that miss irrelevant in the 24th minute, taking advantage of Pepe's weak back-header to round Iker Casillas and slot the ball into the net.
Dortmund were rampant, Casillas tipping a Mats Hummels header over the bar from Reus' curling free-kick, before the Germany playmaker doubled his tally in the 37th minute as once again Madrid contributed to their own downfall.
Asier Illarramendi surrendered possession, allowing Reus to feed Robert Lewandowski, and as his shot was tipped onto the post by Casillas, the 24-year-old was on hand to smash in the rebound.
Real made a bright start to the second half, Gareth Bale testing Weidenfeller with a stinging effort in the 49th minute, before a last-ditch challenge from Hummels denied Karim Benzema as the Frenchman prepared to shoot into an empty net on the hour mark.
Despite their improved showing, Madrid were lucky to stay ahead in the tie in the 65th minute when Mkhitaryan struck the outside of the post after rounding Casillas following more excellent work by Reus.
The Armenian again went close three minutes later, this time seeing his strike saved by the Spanish goalkeeper as Dortmund continued to press, Casillas also denying Kevin Grosskreutz in the 71st minute.
Despite a frantic finale, Dortmund were unable to carve out one more clear opportunity as the final whistle allowed the visitors to breathe a huge sigh of relief.