Jordan Kyrou, Pavel Buchnevich and Oskar Sundqvist also scored for the Blues (8-10-7), who won for the second time in eight games (2-2-4). Jordan Binnington made 25 saves.
St. Louis was 0-8-1 when trailing after two periods.
Shane Pinto, David Perron and Fabian Zetterlund scored for the Senators (12-8-4), who had won three of the first four of a season-high seven-game road trip. Leevi Merilainen made 27 saves.
Ottawa forward Brady Tkachuk had an assist in his first game since Oct. 13 after missing 20 games with a broken right thumb.
Kessel made it 4-3 at 9:19 when he backhanded a rebound in the crease. The goal capped a flurry that saw Merilainen stop Dylan Holloway, Pius Suter have a rebound attempt blocked by Nick Jensen, and Holloway get denied again.
Sundqvist’s first of the season put the Blues ahead 1-0 at 7:59 of the second period. He collected a rebound off the end boards and banked a shot in off Merilainen from the side of the net.
Pinto tied it 1-1 at 10:11 when he swept a rebound past Binnington, who had stopped Nikolas Matinpalo from in close.
Zetterlund put the Senators in front 2-1 at 18:26. He gathered a loose puck behind the Blues net and looked as if he was going to bring it out at the right post, but he changed direction and tucked it inside the left post instead with Binnington leaning the other way.
Kyrou tied it 2-2 at 2:01 of the third period when he went to the backhand and lifted the puck into the top left corner off a Jake Neighbours cross-ice pass.
Buchnevich then gave St. Louis a 3-2 lead at 5:33, scoring on a one-timer from the right circle off a pass from Brayden Schenn on a 2-on-1.
Perron tied it 3-3 at 7:31 with a backhand from the slot after Blues defenseman Colton Parayko flubbed a pass out of the left corner.