The Rossoneri were forced to use a second-string strike pairing in the absence of suspended striker Mario Balotelli and his replacement Alessandro Matri was particularly wasteful in front of Bologna goalkeeper Gianluca Curci.
Andrea Poli's early opener came against the run of play but Diego Laxalt soon hit his first goals in Italian football to give Bologna the half-time lead.
Jonathan Cristaldo then headed home a third to steer the Rossoblu towards a likely victory but a late double salvo from Robinho and Ignazio Abate spoiled the party at the Stadio Renato Dall'Ara.
Milan remain in the bottom half the table with only five points while Bologna are 16th ahead of Sunday's trip to leaders Roma.
Bologna bared their teeth first, Alessandro Diamanti forcing Christian Abbiati to make a low block on a drilled low shot.
The visitors were unfazed, however, and opened the scoring in the 12th minute, former Sampdoria midfielder Poli seizing on a clever pass from
Robinho to beat Curci with a perfectly-angled drive.
Matri lacked his team-mate's composure and fluffed three chances to extend the lead.
His poor header from close range ended up with Curci and, after he had been teed up for a straightforward finish by Robinho, he ran out of time and space to convert.
The worst was yet to come, though, and his failure to tuck home from a one-on-one in the 25th minute had Milan fans cursing the summer signing from Juventus.
Bologna had kept their concentration and threatened again through Laxalt, whose shot at the near post was flicked out for a corner by Abbiati.
But he would have much better luck in the 33rd minute when he beat Abbiati with a left-footed shot at the end of a swift counter-attack.
Things would not improve for Massimiliano Allegri's men as Bologna doubled up eight minutes after the break.
Laxalt was on target again as he beat Cristian Zapata and Abate to a high ball and beat Abbiati with a firm header.
In the 63rd minute, Bologna made it 3-1.
Laxalt's debut brace had been clinical, if not glamorous, so Cristaldo provided a dose of flair with a successful diving header.
Matri then made a hash of another easy finish, only for the offside flag to spare his blushes.
Time was fast ticking down at the Dall'Ara but, remarkably, Milan found a way to grab a share of the points.
The resolute Curci may have got the better of Matri but he could not hold Robinho back in the 89th minute as the Brazilian recovered from slipping in the box to tuck home.
And as Pioli yelled furiously at his Rossoblu players to batten down the hatches for stoppage time, full-back Abate arrived in the six-yard box to salvage a barely-earned point for Milan.