Humbled 3-0 by Paris St Germain in their Group A opener, the 13-time European champions trailed by two goals at half-time after 21-year-old forward Dennis twice found the net despite almost losing his footing on both occasions.
Real captain Sergio Ramos halved the deficit before the hour while Ruud Vormer's dismissal was followed by Casemiro equalising five minutes from time as the spoils were shared in an entertaining 2-2 draw.
The stalemate is still a great result for the Belgians, who were worth their lead at the break before eventually succumbing to Real's onslaught in the closing stages.
Real rested Gareth Bale for the fixture but it seemed his absence would not be too keenly felt as they started strongly, with Karim Benzema, who has scored five times in six LaLiga outings this season, heading wide early on.
However, a static Real defence allowed Percy Tau to break free on the left before squaring for an onrushing Dennis, who made a hash of what should have been a simple tap-in but the ball still trickled beyond Thibaut Courtois.
Real thought they were spared when the offside flag was raised following Dennis' clumsy finish but a lengthy consultation with VAR led to the decision being overturned.
There was an anxious mood around the stadium as Real struggled to assert themselves in the final third, with Luka Modric hitting into the side-netting from his first-time effort before Toni Kroos saw a deflected volley go wide.
Real were stung again six minutes before half-time, Modric dithering in possession before losing the ball to Dennis, who almost stumbled again before composing himself and intelligently lifting over Courtois.
Kroos flashed wide on the stroke of half-time, which was greeted with furious whistles from the home supporters, with Zinedine Zidane sending on Marcelo for Nacho while Alphonse Areola replaced Courtois in goal.
Areola came to Real's aid when another mistake in midfield led to Dennis breaking free again on the resumption, with the substitute goalkeeper spreading himself to deny the Nigerian youngster a hat-trick.
The one-on-one save proved a crucial intervention as Real halved the lead in the 55th minute, with technology coming to their aid this time after Ramos had headed home at the back post from Benzema's right-wing cross.
The Real captain seemed to be offside but the goal stood after a check with VAR, handing the Spanish giants a route back into the contest.
Brugge were penned back as Real upped the tempo and, despite already dominating possession in the first hour, started to see even more of the ball as they attacked with vigour.
Mignolet was cautioned for time wasting as Brugge sought to run down the clock by any means necessary while highly-rated teenager Vinicius Junior entered the fray for Lucas Vazquez in a final roll of the dice from Zidane.
A late sliding challenge on the 19-year-old Brazilian from Vormer led to the Brugge captain being sent off in the 84th minute and Real capitalised on their numerical advantage from the resulting free-kick.
Kroos' teasing delivery saw Casemiro plant a header beyond Mignolet although Real were unable to find a winner.