Paul Millsap added 25 points and 10 rebounds as the Jazz snapped a nine-game losing streak on the road, their longest since they dropped 17 straight in the 1981-82 season.
The Jazz (37-36) pulled even with the Lakers for the eighth and final playoff spot in the Western Conference, but own the tiebreaker over Los Angeles. The Blazers (33-39) dropped 3 1/2 games back with their third straight loss.
Portland, playing without forward LaMarcus Aldridge because of a sprained right ankle, got 24 points from rookie Damian Lillard. J.J. Hickson added 17 points and 14 rebounds.
The Jazz trailed 92-86 with 3:48 remaining when they took off on their run, led by Williams with 12 points. Williams made a 12-footer and Randy Foye added a layup and free throw with 2:57 remaining to go ahead 93-92, and the Jazz led the rest of the way.
The Jazz were coming off a 103-88 victory at home over the Suns on Wednesday, but it was costly. Center Enes Kanter, averaging 7.2 points and 4.3 rebounds, dislocated his left shoulder. It is not known when he might return.
The Blazers took a 30-22 lead on Wesley Matthews' 3-pointer at the first-quarter buzzer. Victor Claver made a layup after a behind-the-back fake pass that put Portland ahead 34-28.
Derrick Favors' jumper pulled Utah within 40-38 and Al Jefferson's hook shot tied with 4:41 left in the first half. But Portland responded with a 12-0 run, capped by Nicolas Batum's 3-pointer and Hickson's jumper to make it 52-40. Jefferson hit a jumper and the Jazz trailed 54-42 at the half.
Gordon Hayward made a pair of 3-pointers that pulled the Jazz within 64-61 midway through the third quarter. Williams added a pair of layups to give Utah a 65-64 lead.
Claver's dunk put the Blazers back ahead 72-70 before the quarter was over. It was back and forth until Eric Maynor made a 3-pointer that gave Portland an 85-80 lead with 7:55 left.
The Jazz next host the New Jersey Nets Saturday night.