Vinicius Junior capitalised on two errors from Bayern centre-back Kim Min-jae either side of half time to ensure the tie remains finely poised heading into the second leg at the Santiago Bernabeu on May 8.
Los Blancos weathered an early storm from their German hosts, before Vinicius burst through into the space left by Kim to meet a superb pass from Toni Kroos and place a 24th minute opener beyond Manuel Neuer.
The tie was quickly turned on its head within the first 12 minutes of the second half, with Leroy Sane's powerful strike - his first goal since October 28 - followed by a composed penalty from Harry Kane.
Thomas Tuchel's side were on top heading into the final quarter of the contest, but Real were gifted a way back into the tie when Kim fouled Rodrygo inside the area, allowing Vinicius to restore party for Carlo Ancelotti's men with a coolly-taken penalty seven minutes from time.
Vinicius clinical despite bright Bayern start
Bayern made a promising start to the contest and settled significantly quicker than Real Madrid; Sane forced a save from Andriy Lunin at his near post inside the opening 40 seconds, before Kane's audacious, long-range effort from just inside Real's half landed on the roof of the net, much to the relief of the backpedalling Lunin.
Los Blancos struggled to establish a foothold in the early exchanges, but they were happy to soak up the pressure and take their chances on the counter-attack, with Vinicius slotting home their first attempt on goal to open the scoring in the 24th minute.
The Brazilian attacker burst through on goal to pounce on a beautiful through-ball from former Bayern midfielder Kroos, before placing a composed first-time finish beyond a flat-footed Neuer, who should have come off his line earlier to close down the danger.
Ancelotti's men grew into the contest after netting the opener and posed a greater threat in the final third, but Bayern came close to restoring parity on the stroke of half time when Kane whipped a venomous free kick narrowly wide of Lunin's right post.
Tie remains in balance after topsy-turvy second half
Bayern, who brought on Raphael Guerreiro for Leon Goretzka for the second half, were tasked with rediscovering their early spark from the first half, and Sane was the man to provide that with a powerful equaliser less than 10 minutes after the break.
Shortly after Neuer made a strong right-handed save to deny a curling shot from Kroos, Sane picked up the ball on the right flank and burst towards goal before cutting inside and thumping a left-footed shot in at the near post - his first goal in any competition since October 28.
Just a few minutes later, Bayern completed the turnaround, with Kane sending Lunin the wrong way from the penalty spot after Lucas Vazquez clumsily stuck a leg out to bring down Jamal Musiala inside the area.
Kane has now scored a remarkable 43 goals in as many appearances in his debut season at Bayern; the 30-year-old has also been directly involved in 11 Champions League goals (eight goals, three assists), the most ever by an English player in a single campaign in the competition.
Bayern's No.9 was then inches away from netting his second of the night when his shot from a tight angle deflected off Antonio Rudiger and rolled narrowly wide of the post. Eric Dier got his head onto the resulting corner, but his free header was powered straight at Lunin - a huge chance that he would have most certainly buried had he directed his header either side of the goalkeeper.
Ancelotti had seen enough and made three changes within the space of 10 minutes, most notably taking off Jude Bellingham - who has a relatively quiet evening - and Kroos not long after captain Nacho Fernandez was visibly frustrated to be withdrawn.
Bayern looked the most likely to score again and take control of the tie, especially after Tuchel made the bold decision to swap Thomas Tuchel - making his 150th Champions League appearance - for Serge Gnabry to line up with a four-man frontline for the final 10 minutes.
However, Real Madrid were handed a lifeline when Rodrygo was needlessly tugged to the ground by Kim inside the penalty area; Vinicius was left to stand in front of chorus of Bayern boos for over a minute before slotting a composed spot kick beyond Neuer to level the scores at 2-2.
Vinicius has now scored in the Champions League semi-finals for a third successive season and has taken his goal tally for the season to 20 in 34 games across all competitions; only Jude Bellingham (21) has netted more for Real Madrid thus far.
Since the start of the 2021-22 season, Real's No.7 has been directly involved in more goals (31 - 16 goals, 15 assists) than any other player in the Champions League.
Both sides eventually settled for a share of the spoils and will fancy their chances of success in next week's second leg, but they will now briefly shift their attention back to domestic duties, with Bayern travelling to Stuttgart in the Bundesliga on Saturday and Real hosting Cadiz in La Liga on the same day.