Both sides rarely troubled either goalkeeper during the opening 45 minutes, with the only real shot of note coming from Sergio Aguero, who forced a diving save from Everton goalkeeper Tim Howard.
Roberto Mancini's City came out for the second half with a more potent attacking threat, thanks largely to the introduction of Balotelli in place of Edin Dzeko on the hour mark.
It was the Italian who would break the deadlock in the 68th minute, albeit with the aid of a deflection. Aguero was the creator, dribbling across the penalty area before setting up Balotelli, whose low strike crept in via Everton defender Phil Jagielka.
The visiting Toffees offered little going forward throughout, while up the other end David Silva struck the post and saw a goal ruled out for offside as City looked to secure a more convincing win.
The second goal eventually came two minutes from time, with Silva the architect. The Spanish international gained possession inside the Everton half, before slipping a pass through to Milner who slotted beyond the reach of Howard.