Pablo Zabaleta looked to have rescued a point for City with an 86th-minute equaliser but in the second minute of injury time, van Persie’s free-kick flicked off Samir Nasri and crept in to put United in control of the title race.
Wayne Rooney had put the visitors 2-0 up with a first-half brace, before Yaya Toure replied for City on the hour.
There were unruly scenes in the aftermath of van Persie’s winner, with United centre-back Rio Ferdinand left bleeding after appearing to be struck in the face by an object thrown from the crowd.
City substitute Carlos Tevez was also fortunate to escape censure for a wild kick at Phil Jones in the dying stages, but the final whistle prompted full-bodied celebrations from Alex Ferguson’s visiting players.
City had not been beaten at home in the league since December 2010 and were protecting the last unbeaten record in English league football, but they now find their hold on the title slipping after a week that also saw them eliminated from all European competition.
Mario Balotelli was handed a surprise start by City coach Roberto Mancini and he had City’s first two openings, forcing David de Gea into a scrambling save with a low free-kick and then ballooning Gael Clichy’s cutback over the bar.
United had not been near the hosts’ area, but in the 16th minute they drew first blood.