The City duo now face an anxious wait to see if they will reach the knockout stages following the 1-1 which meant they finished third in Group B.
After taking just a point from their first two games, the World Cup semi-finalists needed to win to guarantee a place in the last-16.
Italy needed a point to secure second place and they brought an even better save from Dominik Livakovic who tipped over Alessandro Bastoni’s close-range header.
After going in goalless at half-time, Croatia had a huge opportunity to go ahead eight minutes after the break when they were awarded a penalty for handball against Davide Frattesi.
Luka Modric’s low spot-kick was saved at full-stretch by Donnarumma but the veteran midfielder took less than 60 seconds to make amends for his miss.
Donnarumma made another brilliant save to deny Ante Budimir from close range but Modric reacted quickest to the loose ball to smash Croatia ahead.
Italy pushed for an equaliser and Bastoni was just over with a header while Gianluca Scamacca was inches away from connecting with a low cross.
But there was to be one last twist as Mattia Zaccagni curled in a stunning strike to rescue the point they needed with virtually the last kick of the game.
They will now play Manuel Akanji’s Switzerland on Saturday at 17:00 (UK) while Croatia must wait to see if they will go through as one of the four best third-placed teams, although with two points and a -3 goal difference, their chances don’t look good.
After winning both those games, Spain were already assured of top spot and made 10 changes with former City winger Jesus Navas named captain as he became the oldest player to represent his country at the age of 38.
Another ex-City forward Ferran Torres got the only goal with a low strike in the 13th minute.