Neither side created a goal-scoring opportunity inside the opening quarter-of-an-hour, but Ruben Castro was able to break the deadlock 17 minutes in, bundling the ball in from close range.
The home side were behind for just five minutes, as Fabian Orellana headed in from close range following a well-placed Rafinha cross. They took the lead on the half-hour mark with another headed goal, as Charles nodded in from a Hugo Mallo delivery.
Orellana completed his brace shortly before the break, with Mallo setting up the goal again by picking out his teammate with a low cross, before a curling finish into the top corner secured the third of the night for the home side.
Celta continued to look the stronger of the two sides at the start of the second half, and managed to increase their advantage with just over 15 minutes left to play, as Charles fired the ball in towards Nolito, who was able to smash the ball into the back of the net.
Castro added his second of the match in the 78th minute to provide the visitors with some late hope, but they were unable to find a third.
Things got worse for Betis before full time as Cedrick was sent off for a dangerous challenge on Rafinha.