Zlatan Ibrahimovic är tillbaka efter hälseneskadan och gjorde sin första 90-minutersmatch sedan bortamötet med Juventus 9 maj.
Den nyblivne 40-åringen visade klass direkt när han spelade fram Rafael Leao som satte dit ledningsmålet.
Det såg ut att bli en enkel trepoängare för Milan när Bolognas Adama Soumaoro kort därefter åkte på ett rött kort och Davide Calabria utökat till 2–0 – men hemmalaget kom tillbaka, med svensk hjälp.
Ibrahimovic skulle mota bort en hörna, men styrde i stället in bollen i egen bur och Bologna fick vittring igen. Bara tre minuter senare kvitterade Musa Barrow till 2–2.
Milan inledde en kraftig forcering i slutminuterna och i den 84:e minuten dundrade Ismael Bennacer in ledningsmålet. Zlatan Ibrahimovic fick också sin revansch när han på stopptid fastställde slutresultatet till 4–2.
Efter segern går Milan upp i toppen av Serie A-tabellen med 25 poäng efter nio omgångar. Napoli är en poäng bakom med en match mindre spelad.