Stefano Pioli – back in the dugout after missing three games with COVID-19 – saw his side get off to a torrid start, with Tomas Rogic and Odsonne Edouard putting Neil Lennon's struggling Scottish Premiership outfit into an early two-goal lead.
Milan powered back, though, and restored parity with quickfire goals from Hakan Calhanoglu and Samu Castillejo before the break.
Jens Petter Hauge scored a wonderful goal at the start of the second half and set up substitute Brahim Diaz with eight minutes remaining, with Milan advancing to the knockouts courtesy of Lille's dramatic late comeback for a 2-1 win over Sparta Prague in the group's other game.
Milan started in slapstick fashion and found themselves deservedly two goals down after just 14 minutes.
Rogic took full advantage of Rade Krunic's dismal control from Gianluigi Donnarumma's pass to whip into the bottom-left corner from 18 yards, before Edouard made the most of more woeful defending to clip over the Milan goalkeeper.
The hosts belatedly woke from their slumber and drew level thanks to two goals in the space of two minutes.
Calhanoglu scored his 18th direct free-kick in all competitions since the start of the 2013-14 season – second only to Lionel Messi (36) in Europe's top five leagues in that time – to reduce the deficit, before Castillejo wiped out Celtic's lead with a deflected close-range finish after Ante Rebic superbly teed him up with a backheel.
Hauge put Milan ahead five minutes after the interval, the Norway international skipping past a number of Celtic players before rolling a fine finish beyond Vasilios Barkas from 15 yards.
Donnarumma did well to paw away Ryan Christie's free-kick and Diaz wrapped up the win late on, lifting over Barkas after more impressive work from Hauge as Milan sealed a fifth consecutive triumph against Celtic, who have been victorious in just two of their past 11 games in all competitions.
What does it mean? Milan recover from shocking start
After just one point from their double header against Lille, Milan looked destined for another Europa League setback after some calamitous defending early on. They responded well, though, and were ultimately good value for all three points.
They remain one point behind leaders Lille and will need to beat Sparta Prague next week and hope the Ligue 1 side drop points against Celtic if they are to qualify as group winners.
Hauge on fire for hosts
Hauge was outstanding in the second period. He put Milan ahead with a dazzling run and composed finish and made a game-high three key passes, one of which led to Diaz's late goal.
Krunic put out of his misery early
It was little surprise to see Krunic hauled off at the interval for Sandro Tonali. The Bosnian was badly off the pace, giving the ball away for Celtic's first and registering a pass completion rate of just 72.7 per cent – his midfield partner Franck Kessie's mark in an hour on the pitch was 96.2 per cent.
Key Opta Facts
- Celtic have won just two of their 25 away matches in the Europa League (D11 L12).
- Edouard has been directly involved in seven goals in his past eight Europa League starts (five goals, two assists).
- There were just 121 seconds between Milan's first two goals of the game.