Lucas Paqueta was sent off for the hosts, while Bologna ended the match with nine men after Mitchell Dijks and Nicola Sansone were both dismissed in second-half injury time.
Mattia Destro had pulled a goal back for Bologna, who remain 15th.
Milan opened the scoring after 37 minutes when Suso grabbed his first goal since January when he collected the ball on the edge of the area, held off three challenges and found the bottom corner.
Borini made it 2-0 after 67 minutes pouncing from close range after Lukasz Skorupski saved Paqueta's deflected half-volley.
Destro made it 2-1 when he collected Sansone's cute pass and fired in from six yards.
Paqueta collected his second yellow card three minutes later before Dijks and Sansone walked in stoppage time.