The visitors took the lead on 11 minutes when Jose Fonte’s sloppy back-pass was seized upon by the Dutchman and he slid the ball past Fraser Forster.
Southampton were always the team showing more energy and levelled things up on 31 minutes as Graziano Pelle fired home after Dusan Tadic’s shot deflected into his path.
But the hosts could never get their noses in front and paid the price with 19 minutes remaining as Wayne Rooney’s free-kick evaded everyone but Van Persie, who skilfully prodded home from a tight angle.
The result moves Louis van Gaal’s men above Southampton – beaten for the third straight game – and into third place in the Premier League.
Both sides made two changes from their midweek games, with Maya Yoshida and Sadio Mane coming in for Southampton and fit-again Rooney and Paddy McNair starting for United.
Despite making a bright start, Southampton fell behind early on as Van Persie was given an early Christmas present by Saints skipper Fonte.
Under no pressure, the defender played a poor back pass to his goalkeeper Forster and Van Persie was onto it like a shot.
The striker composed himself before rolling the ball under the advancing goalkeeper to score his second goal in his last three games.
For a team that were on a four-match winning run, United looked short on confidence as Southampton’s game plan of pressing high up the pitch caused the visitors problems and their task was made more difficult when Chris Smalling picked up an injury on 18 minutes and had to be replaced by Jonny Evans.
The equaliser came midway through the first half when Marouane Fellaini gave away possession in the middle of the field and the hosts broke down the right-hand side. From a Shane Long cross Tadic showed great composure to control and fire a shot goalwards and although his effort was blocked, Pelle was quickest to react from six yards for his first goal since October.
The leveller gave Southampton a lift and another cross was not dealt with by McNair, but Long could only fire over from 12 yards when he had time to pick his spot.
That mistake was McNair’s last involvement in the game as Van Gaal ruthlessly replaced the youngster with midfielder Ander Herrera and moved Michael Carrick into central defence.
Southampton continued to have the upper hand after the break and David de Gea had to be alert to divert a Long header away from goal after Tadic found the former West Brom man with a wonderful cross.
Ronald Koeman’s side were left to rue that missed chance on 71 minutes as Van Persie showed his predatory skills to restore United’s lead.
Rooney sent in a whipped cross from the touchline that found the space between Forster and the defence and as the ball flew deep into the box, Van Persie was quickest to react at the back post and flicked the ball in the net.
There was time for De Gea to once again deny Pelle with a one-handed save down to his left as United defended deep and soaked up pressure for the remaining 15 minutes, but they held on for a victory that their manager later described as “lucky”.
Gary Neville’s verdict
“It was so bad at times. It got slightly better in the second half, but it wasn’t a good United performance even if it was a great result. They’ll think that’s all that matters but they are going to have to step it up. They’ve got away with murder tonight really with that performance. Southampton weren’t very good at times and looked like a team shot on confidence. All in all, United will be happy with the result, but they’re going to have to play better than that.”
Manchester United: De Gea (8), McNair (5), Smalling (6), Rojo (5), Valencia (6), Carrick (6), Fellaini (6), Young (7), Mata (6), Rooney (6), Van Persie (9)
Used subs: Evans (7), Herrera (6).
Southampton: Forster (5), Clyne (6), Bertrand (6), Yoshida (6), Fonte (5), Long (5), Davis (7), Mane (6), Tadic (7), Wanyama (6), Pelle (7).
Used subs: Mayuka (6), Hesketh (6).
Man of The Match: Robin van Persie