The defending champion withstood a Bayern siege at the Bernabeu, with manager Zinedine Zidane later admitting watching the tense match was not good for his heart.
Though the German champion had 39 shots over the two legs, it is ruthless Real which will contest its third consecutive final after the tie finished 2-2 to give it a 4-3 victory on aggregate.
Ultimately, profligacy in front of goal and a dreadful goalkeeping mistake proved to be Bayern's downfall.
Zidane, the first manager to reach three consecutive Champions League finals since Marcello Lippi between 1996 and 1998, admitted his team suffered.
"We know you can't get to the final of it without suffering, and it's nicer this way. It's not great for your heart, though," he told reporters.
"It's in the DNA of the club. We never stop fighting up to the very last minute, just as the Bayern players did."
Benzema brace, goalkeeping howler
Leading 2-1 following the first leg in Germany, Real got off to the worst possible start after Joshua Kimmich gave Bayern the lead inside three minutes.
But two goals from Karim Benzema, the second following a horrendous error by goalkeeper Sven Ulreich, turned the tie on its head.
Despite an equalizer from James Rodriguez, who is on loan at Bayern from Real Madrid, the German side was unable to find a winning goal -- thanks in part to some sensational goalkeeping from Keylor Navas.
The goalkeeper made eight saves against Bayern to secure his team's progress to a 16th European Cup final.
Bayern also had a possible Marcelo handball claim turned down in the first half, with the Real defender himself later admitting he thought it was a handball.
Jupp Heynckes, Bayern manager, told reporters: "We are very disappointed. My team played an outstanding game.
"I haven't seen Bayern play as well as that for years.
"At this high level you can't make the sort of mistakes we made after halftime.
"We played brilliantly. I think over the course of the two legs we were the better team, but as so often happens in football the game was decided by the small details."
Much like it did in the first leg, Bayern Munich started the match on the front foot.
Knowing he needed a minimum of two goals to progress, Heynckes set his side out to press and hassle Real's backline.
Having clearly targeted makeshift right-back Lucas Vazquez, who is a forward by trade, as the weak link in Real's starting lineup, most of Bayern's early attacks cam