Victory over the 16th-placed Sardinians would have assured Milan of a top-four finish and their first appearance in European football's top club competition since 2013-14 next season.
But Stefano Pioli's side toiled to a disappointing draw that leaves them third on 76 points going into the final round, level with Napoli in fourth but above them on head-to-head record, and one point ahead of fifth-placed Juventus.
The hosts were limited to speculative long-range efforts in the first half and risked going behind after the break, but Donnarumma produced top saves to deny Leonardo Pavoletti and Diego Godin headers.
They received another boost when Benevento's draw with Crotone meant Cagliari's safety was secured and the visitors would not be fighting for their lives at San Siro.
But Milan put in a sluggish display and created few chances of note. Alexis Saelemaekers' driven shot required a smart save from Alessio Cragno and Davide Calabria drilled a long-range effort wide in the first half.
Donnarumma kept the score level after the break, using his legs to block a Pavoletti header from six yards before flying to his right to claw away Godin's headed effort with his right hand.
Pioli turned to his bench to try and find a spark and Samu Castillejo was the liveliest of the replacements. However, the Spaniard, like his team mates, struggled for accuracy as he was off target with two efforts before a stoppage-time volley was deflected over off Godin's head.