After a goalless draw in the first leg of the quarter-final between two of Europe's heavyweights, Messi, 24, netted an early penalty, making him the youngest player to reach 50 goals in the Champions League.
Antonio Nocerino equalised with a fine goal for the Italian side but Messi restored Barca’s advantage with another spot kick which put the Argentine level with former Milan forward Jose Altafini’s season record of 14.
That knocked the stuffing out of Milan, who were never in the races from that point onwards, Andres Iniesta adding a third and Barca wasteful as they chased a fourth in the latter stages.
Barca next face the winner of Chelsea and Benfica's tie, setting up a tantalising replay of previous clashes with the Blues and a possible Clasico final against Real Madrid in May.
As expected, Barca took the game to the visitors with their unique brand of passing dominance, but the Rossoneri had ideas of their own, threatening on the counter attack.
Indeed, the first real danger came from Milan, as Nocerino’s drilled low ball wreaked havoc on five minutes: Barca responded with a break of their own, Messi firing straight at Christian Abbiati after searing clear of Alessandro Nesta.
Messi may have been the star of the show but was guilty of uncharacteristic profligacy, putting wide from close range after chesting down Cesc Fabregas’s flick.
He made amends soon afterwards but the opening goal was all about a Milan comedy of errors: first Philippe Mexes was caught dilly-dallying by Messi, who raced clear. The Argentine wizard should have scored but, with just Abbiati to beat, he elected to cut the ball back, the chance gone.
Or so he thought - Milan’s centre-halves made a pig’s ear of clearing the ball, and as the ball skittered across the box Messi was caught by Luca Antonini’s desperate lunge.
The FIFA World Player of the Year made no mistake from the spot, drilling it past the outstretched arm of Abbiati, his first record of the night.
The script is usually pre-written after Barca take the lead and they almost added a second but for Nesta’s intervention after Fabregas was played in by Isaac Cuenca, the youngster surprisingly preferred to Alexis Sanchez.
Abbiati then made a brave stop at the feet of Daniel Alves after the Brazil wing-back wriggled through as Barca pushed hard for a second.
But Milan stunned them with a 33rd-minute equaliser, Nocerino putting them level on the night and ahead on away goals with a slick low finish after Ibrahimovic’s excellent diagonal through ball.
The upset was on but Dutch referee Bjorn Kuipers had other ideas: a routine tangle at a Barca corner saw him point to the spot. Milan were furious as - though Nesta had a piece of Sergio Busquets’s shirt - Carles Puyol was also tugging away.
Such incidents are common, with most referees opting to warn players first, so Milan could be forgiven their incredulity.
Messi, uninvolved, was cool as a cucumber as he sent his low penalty into the other corner to put Barca back in front. Milan continued to complain but Barca, with two possibly penalties rejected in the away leg, will feel justice was done.
Abbiati made another decent stop from Messi late in the half, setting the tone for what would be a second 45 that Barca dominated, with Milan barely able to get a look in.
Xavi curled a free-kick just wide before, on 54 minutes, what would prove to be the match-ending moment saw Messi’s shot blocked by Mexes, the Frenchman as unfortunate as he was hapless earlier as the ball dropped to Iniesta: the Spaniard killed it dead first time before flicking a finish past Abbiati.
Milan had run out of ideas while Barca slipped into cruise-control: Massimiliano Allegri threw on Alexandre Pato, returning from a back injury but fluffing his lines when put through by a long ball, mis-controlling it into Victor Valdes’s arms.
He was hauled off just 14 minutes after coming on, and his replacement Maxi Lopez fared little better, barely getting a touch and one of several players booked late on as the visitors lost their collective rag.
You could hardly blame him as, at times, Kuipers was giving Milan carte blanche to question him: the decision to call back Robinho for handball when Gerard Pique’s point-blank clearance may have rebounded off an arm was absurd.
Meanwhile Barca were making, and missing, chances for fun: sub Thiago Alcantara put wide when it looked easier to score, Messi was denied by a flying Abbiati and Adriano - on for an injured Pique - put a defender’s finish wide when clean through.
A thrashing would have been unfair on Milan, who can now focus on fending off Juventus in the race for the Serie A title; Barca, meanwhile, are challenging on three fronts, six points shy of a stuttering Real Madrid in La Liga and with a Copa del Rey final to look forward to.