Antonin Barak and Mattia Zaccagni put Ivan Juric's visitors 2-0 up inside 20 minutes before an own goal from Giangiacomo Magnani gave the hosts hope.
Ibrahimovic then failed from 12 yards for the third time this season - his fourth miss in six attempts going back to last term - and Davide Calabria saw an effort ruled out in the first minute of second-half stoppage time after the Swede had handled in the build-up.
Milan's talisman had the final say, however, heading home Brahim Diaz's cross two minutes later to snatch a draw that moves Stefano Pioli's side two points clear of second-placed Sassuolo at the Serie A summit.