Second-half substitute Brian White also scored for the Whitecaps (3-6-2, 11 points), who extended their unbeaten streak to three matches in their bid to escape the Western Conference cellar.
Paul Arriola scored in first-half storage time for Dallas (6-2-4, 22 points), which missed a chance to perhaps move into the conference lead.
The Whitecaps limited Jesus Ferreira, MLS's leading scorer with nine goals, to just two shot attempts, neither of which were on net.
The penalty kick came after veteran Dallas goalkeeper Jimmy Maurer misplayed the ball near the end line in the corner of the 18-yard box.
A Dallas defender blocked White's shot, but the rebound was retrieved by Vancouver's Ranko Veselinovic near the top of the penalty area. As Veselinovic tried to turn back toward the net, he was tripped by Dallas' Edwin Cerrillo.
Cavallini blasted the PK into the right side of the net as Maurer dove the wrong way.
White's tying goal came in the 71st minute. Cristian Gutierrez's cross from the wing found White at the top left of the 6-yard box, and his header snuck just inside the near post after going off of Maurer's hand.
Dallas' goal came on a counterattack.
Jader Obrian dribbled the ball down the left wing and centered it to Ferreira. As the defense collapsed on Ferreira, he passed to a wide-open Arriola on the right wing as he made a run toward the net. Arriola put a left-footed shot from about 10 yards out just under diving Whitecaps goalie Cody Cropper, who was making his second straight start for the injured Thomas Hasal.
Arriola nearly had a goal earlier in the match on a free kick from 25 yards, but just missed the upper right corner of the net with the ball sailing just over the crossbar.