Rovers and Millwall were heading for a point apiece after David Jones' freak goal had cancelled out Karleigh Osborne's first-half opener for the hosts.
But with 12 minutes to go referee Gavin Ward adjudged Danny Shittu had tripped Grant Hanley inside the penalty area.
Millwall protested long and hard, claiming Hanley had dived, but Rhodes kept his nerve to tuck in his 27th goal of the season.
Lions skipper Shittu continued his protest after the final whistle and was shown a second yellow card followed by a red by referee Ward.
It meant Rovers leapfrogged Millwall into 15th spot, five points above the relegation zone with two matches left.
The Lions led through defender Osborne's first goal for the club, but should have been further ahead by the time Rovers levelled, as Jack Smith and James Henry had already seen efforts fly just wide before Osborne struck in the 14th minute.
Hanley was booked for lunging in at Liam Feeney and, from the free-kick, Henry found the head of Mark Beevers at the far post, whose header back across goal was blocked but it fell to Osborne, who swivelled like a striker before lashing the ball into the net from eight yards.
Rovers lost striker Colin Kazim-Richards to injury early on and barely threatened until the final 10 minutes of the first half.
And in stoppage time a fierce 25-yard drive from Jones was heading for the top corner until Lions goalkeeper David Forde got a fingertip on it to make a superb save.
But the equaliser came in the 56th minute when Jones swung a corner towards the near post which squirmed past Rob Hulse and into the net, leaving the on-loan QPR striker with his head in his hands.
Forde made another good save from Dunn but was furious when referee Ward pointed to the spot in the 78th minute. Both he and Shittu were booked for their protests before Rhodes sent Forde the wrong way.
Osborne could have snatched a dramatic equaliser in stoppage time but his shot was kept out by the legs of Grzegorz Sandomierski as Rovers held out for a crucial win.