The visitors went ahead after nine minutes when Verona's Miguel Veloso deflected Rafael Leao's cross into his own net.
Olivier Giroud could have scored a second goal for Milan two minutes later when he was found by Brahim Diaz but his finish went wide.
Verona deservedly equalised after 19 minutes when Koray Gunter's weak shot deflected off Milan defender Matteo Gabbia which took it beyond keeper Ciprian Tatarusanu.
The last part of the first half lacked the intensity of the opening period as both teams looked for opportunities to counter-attack rather than push forward.
Ajdin Hrustic went close to putting the hosts ahead two minutes after the break but his curling shot from close range went just wide.
Milan substitute Ante Rebic was one-on-one with Lorenzo Montipo in the 49th minute, but his shot was superbly parried by the keeper.
Verona went close to taking the lead in the 56th minute when an unmarked Roberto Piccoli's header hit the crossbar, and Gunter's rebound went over the bar.
Milan secured the win in the 81st minute when Rebic found Tonali alone in the box with a perfect ball across and he had no trouble finishing past Montipo.
Milan, third on 23 points, are now three points behind league leaders Napoli after 10 games. Verona remain stuck in the relegation zone on five points in 18th place.