Alex Steen also scored for St. Louis, which won for the third time in the last 10 games. Vancouver lost for the second time in nine games.
St. Louis had scored just once in 12 previous power plays, but went 2 for 5 on Monday. Vancouver had killed off 36 straight penalties before Andy McDonald connected at 5:10 of the first period for a 1-0 lead.
Berglund added a man-advantage goal late in the second period to make it 3-1.
Vancouver goalie Roberto Luongo had a 21-game regulation unbeaten string snapped. He came in with a 16-0-5 mark and had won his previous six starts.
Steen put St. Louis in front for good midway through the second period. He capitalized on a bad clearing pass from Luongo to break a 1-1 tie. Luongo partially fanned on the puck and it slid right to Steen, who backhanded it into the open net. Steen, who has 16 goals, had not scored in his previous 11 games.
Vancouver winger Jannik Hansen scored with 18:13 left in the third period to trim the deficit to 3-2. But Blues goalie Jaroslav Halak stopped the final eight shots to improve to 19-17-6.
St. Louis defenseman Alex Pietrangelo assisted on both power-play goals.
Vancouver bounced back from McDonald's goal to tie it 1-1 on Henrik Sedin's 13th tally of the season. Alexandre Burrows assisted on the goal to extend his point streak to 10 games, the longest current one in the league. Burrows has eight goals and four assists over the 10 games.
The Blues, with 59 points, moved to within six points of Minnesota for the eighth and final playoff spot in the Western Conference.
Notes: St. Louis D Barret Jackman played in his 500th career game. ... St. Louis has sold out all 29 home games this season. ... Vancouver's Henrik Sedin has a league-best 55 assists. ... The Canucks still lead the NHL with 81 points. They have never held the top spot in the standings this late in the season.