The Saddlers had gone ahead in the first half through Sam Mantom and looked capable of holding on to the lead in an exciting game which flowed from end to end.
Yeovil missed some good early chances with Luke Ayling hitting the crossbar after 34 minutes and they paid the penalty a minute before half-time.
Mantom shot from the edge of the box after a right-wing cross from Alex Nicholls and Yeovil keeper Sam Walker was slow to get down to the shot which crept inside his left-hand post.
The second half produced a fluke goal for Yeovil after 63 minutes when Jonathan Franks shot from the edge of the box and the ball bounced off the back of Williams to loop over keeper David Grof.
Williams claimed his 10th goal in as many matches to win the game after 84 minutes. He hooked a left-wing corner goalwards and substitute Anton Peterlin helped it into the net as he attempted to defend.