Having come on shortly after half-time, right-back Calabria made an immediate impact when he teed up Theo Hernandez's equaliser in the 55th minute at Stadio Olimpico.
Hernandez's effort cancelled out Edin Dzeko's first-half opener, but Calabria ruined his good work when his loose ball enabled Nicolo Zaniolo to restore Roma's lead.
Gianluca Mancini's poor miss kept Milan's hopes alive but their new coach failed to inspire a comeback as the Rossoneri remain entrenched in the mid-table.
Milan had the better of the opening stages, Franck Kessie's slide-rule pass splitting Roma's defence in the 16th minute, but Lucas Paqueta strayed offside before drilling under Pau Lopez.
Javier Pastore failed to capitalise on a Kessie error soon after, though Dzeko made no such mistake in the 38th minute, heading home unmarked at the far post after a corner was flicked on.
Pastore would have doubled Roma's lead before the break if not for Gianluigi Donnarumma's fantastic save, and Milan's goalkeeper was left rooted to the spot when Chris Smalling sent a close-range header wide.
Smalling's frustration was compounded when he deflected Hernandez's volley beyond Lopez after Milan's left-back connected with Calabria's cross.
Parity lasted just three minutes, however - Dzeko pouncing on Calabria's slack pass to turn provider for Zaniolo, who coolly whipped a low finish into the left corner.
Mancini should have doubled Roma's advantage with a free header, but Milan could not make its host pay for the midfielder's profligacy, with Hakan Calhanoglu missing a pair of late attempts to draw level.