Betis dominated possession and territory in the first half but were unable to break the deadlock, with Jorge Molina crashing their best opening off the crossbar from close range.
Celta looked a different side after the break and hit the post with a strike from distance, before Charles turned their bright play into an advantage soon after.
The striker scored his second goal in as many games for Celta with a neat turn and finish inside the penalty area, finding the bottom corner with a composed effort.
Seven minutes later Betis were caught cold as the visitors doubled their lead through Nolito, who cut inside to beat his marker before slamming home with authority.
Celta were reduced to 10 men in the closing stages as Borja Oubina saw red for deliberate handball just outside the penalty area.
From the free kick Ruben Castro pounced on a loose ball to reduce the deficit, but Celta just about held on to claim three precious points as Verdu struck the crossbar in stoppage time.