Timo Werner scored twice and Romelu Lukaku ended his goal drought, while Kepa Arrizabalaga delivered a sensational display as a sub-par Blues thought they grabbed a late win.
But an unbelievable injury-time equaliser from Magomed Ozdoyev denied Thomas Tuchel's side top spot in the dying moments of the group stage
With Juventus beating Malmo in Group H's other fixture, it'll be Ajax, Bayern Munich or Real Madrid in the last-16 for Chelsea.
Claudinho and Sardar Azmoun put the hosts in front after Werner's opener, before Lukaku levelled things up with his first goal in 11 games.
Werner, who also created the equaliser, survived a close VAR check to put Chelsea back in front in the 85th minute, but Ozdoyev ensured the Blues leave Russia disappointed with a stunning volley.
And despite conceding three goals, goalkeeper Kepa was among the only reasons Chelsea didn't lose, delivering three spectacular saves.
On Zenit's last-gasp equaliser, Matt Holland told talkSPORT: "Kepa has been imperious tonight, but he is powerless to stop this."
Despite Kepa's heroics, which included one astonishing save with the scores level at 2-2, Chelsea conceded three goals for the second time in four days, following their 3-2 defeat at West Ham.
The Blues are looking uncharacteristically sloppy heading into the busy Christmas period, as an injury crisis threatens to derail their campaign.