The game began with Venezia pushing forward, but Milan found the perfect response with the opening goal just four minutes in. The Rossoneri won the ball high up the pitch and a clever pass from Youssouf Fofana found Christian Pulisic, who calmly scored.
Venezia dominated the rest of the first half and had their first chance on goal when Alessio Zerbin found space in the box, but his shot went wide of the near post.
The hosts continued to push and thought they had equalised 10 minutes before half-time when John Yeboah scored after a quick one-touch move. However, the celebrations were short-lived as the VAR ruled him offside.
Just before the break, Mike Maignan was called into action to deal with a free-kick from Hans Nicolussi Caviglia, keeping Milan ahead at the interval.
After the break, Milan had a good chance to extend their lead, but Rafael Leao's shot went over the bar.
Venezia made four changes after the hour mark, but Milan took advantage of their attacking threat fading to score again at the end. Santiago Gimenez scored with a clever lob over Ionuț Radu to seal the win.
Although Milan picked up three points, they remain ninth in the standings, but are now within five points of sixth-placed Lazio. Meanwhile, Venezia stay 19th, one point away from safety, and have only won four games all season, leaving them running out of time to save their Serie A status.