Celta, who had held Barca to a 1-1 draw in their Copa del Rey last-16 first-leg tie on Thursday, were denied an early goal by the woodwork.
The home side had taken the lead on 33 minutes through a fine chip by Daniel Wass, only for Wales forward Bale — fit again following a calf problem — to swiftly draw Real level.
Aspas was played into the area and, as he tried to take the ball around the goalkeeper, the former Liverpool frontman was pushed to the floor. Referee Jaime Latre pointed to the spot, before brandishing a yellow card for Navas, who had defender Raphael Varane covering on the line.
Isco played the ball in from the right, and Bale benefited from a borderline onside call just inside the home box to knock the ball in with the outside of his boot.
The hosts, though, finally got their equaliser when Wass floated the ball through the penalty area from the right and Gomez powered a header past Navas.
There was still time for Cristiano Ronaldo to lash an angled drive into the side-netting – and for Aspas to see what looked a strong shout for another penalty waved away after a clumsy challenge by Marcelo.
Bale then swept in another on 38 minutes to complete the turnaround. Real goalkeeper Keylor Navas then saved a second-half penalty from Iago Aspas before, with only eight minutes left, Gomez nodded in a deserved equaliser.
Before the home side could mount a recovery, they were behind.