Boro were trailing for more than an hour after Jed Wallace rounded off a slick counter-attacking move with a precise first-half finish.
But despite toiling for most of the game, the Teessiders were handed a last-gasp lifeline when Millwall substitute Steve Morison bundled over Daniel Ayala in the box. Hugill converted from the spot to secure his side an equaliser.
Millwall travelled to the North-East buoyed by their festive form, and dominated from the outset.
With Wallace and Ben Marshall playing on either side of Lee Gregory, the visitors were able to boast plenty of attacking players breaking into the box whenever they pushed into the Middlesbrough half, and it did not take them long to start creating chances.
Gregory should have opened the scoring in the tenth minute, but while the ball fell invitingly for the Millwall striker after the Boro defence failed to deal with a corner, his close-range shot was smothered by an onrushing Darren Randolph.
Gregory shot into the side-netting shortly after, and the forward was a central figure once again as the visitors claimed the lead in the 22nd minute.
A swift counter-attack ended with the ball at Gregory's feet as he advanced in the Middlesbrough half, and with Daniel Ayala and Danny Batth both being drawn to the same player, Millwall's number nine was able to slip a square pass to the unmarked Jed Wallace.
Wallace steadied himself, before slipping a crisp low finish past Randolph.
The goal was no more than Millwall deserved, and they almost added another when Shaun Williams delivered a dangerous cross from the left, only for Ben Thompson to direct his header straight at Randolph.
Middlesbrough hadn't created anything at that stage, but with the home supporters becoming increasingly discontent, Tony Pulis' side finally began to stir in the closing stages of the first half.
Lewis Wing shot wide from 20 yards and Jonny Howson finally forced a save from Jordan Archer as he propelled Adam Clayton's cross towards goal with a diving header.
Boro's players felt they should have had a penalty from the same move, with Shaun Hutchinson appearing to block off Hugill's run into the box.
Pulis introduced Rajiv van La Parra at the interval in an attempt to inject some pace into his side's attacking, and the recent loan arrival from Huddersfield Town almost had an instant impact, drilling in a deflected strike that Archer saved.
The Millwall goalkeeper was involved again shortly after, parrying a fiercely-hit shot from Wing, but he was powerless to prevent Boro levelling with virtually the last kick of the game.
Morison brought down Ayala after Stewart Downing crossed from the right, and Hugill rolled home the resultant penalty.