There was a surprising lack of chances in the opening half an hour and Celta came closest to scoring when Fabian Orellana latched onto a sliced Gerard Pique clearance, but Jose Pinto made a superb save to deny him.
On 40 minutes the hosts were ahead with Natxo Insa turning the ball in after a mazy fun from Orellana.
However, Barca were level before the break when Cristian Tello was found by Messi before cutting inside and finishing well.
In the second half Barca pressed on and on 73 minutes finally went ahead, this time Tello setting up Messi to make it 2-1.
Barca pushed forward for a third but it was Celta who had the final say, Borja Oubina thumping home a far-post header to give Celta a share of the spoils.