The Rossoneri boasted a 3-0 lead in the tie from the first leg but were under the cosh from the off at San Siro as the Bulgarians set about trying to whittle down the deficit.
At the other end, Ludogorets struggled to clear both a Franck Kessie cross and Silva's follow-up on the rebound as the hosts ended the first half on top.
The second period then began in similar fashion as to how the first half ended, with Milan on top and dominating possession.
However, Cutrone spurned a gilt-edged opportunity to double the Rossoneri's advantage on 53 minutes, firing wide from Borini's chip into the box despite being completely unmarked.
Ludogorets caused panic in the Milan backline just after the hour as Natanel fired into the side-netting from close range.
Despite the odd foray forward by the visitors, it ultimately proved a comfortable night for the Italians, who cruised into the last 16 of the competition.
AC MILAN (4-3-3): A Donnarumma; Abate, Zapata, Romagnoli (Bonucci 74'), Rodriguez; Kessie (Mauri 56'), Montolivo, Locatelli; Borini, Silva, Cutrone (Kalinic 56')
LUDOGORETS RAZGRAD (4-2-3-1): Broun; Natanel, Moti, Terziev, Cicinho; Goralski, Abel (Dyakov 82'); Wanderson, Marcelinho (Campanharo 63'), Misdjian (Lukoki 71'); Swierczok