The Spanish third seed, who reached the Rome semi-finals last year before going on to win her sole career grand slam, will next face eighth seeded Ukrainian Elina Svitolina, who earlier upset Czech second seed Karolina Pliskova 6-2 7-6(9).
Muguruza used a solid forehand to power through the first set during which she hit just eight unforced errors but gave up 20 in the second as Williams forced a decider.
The Spaniard fell behind in the third set before responding immediately with a break. She clinched the match when seven-times grand slam champion Williams sent a forehand wide.
With the win, world number seven Muguruza will return to the top five in the rankings and be guaranteed a top-four seeding at Roland Garros for the year's second grand slam.
In other action, Romanian sixth seed Simona Halep swept into the semi-finals by beating Estonian qualifier Anett Kontaveit 6-2 6-4 on Friday.
Simona Halep of Romania celebrates winning against Anett Kontaveit of Estonia during the WTA Tennis Open tournament in Rome at the Foro Italico, on May 19, 2017.
Image credit: Getty Images
She will now play Dutch 15th seed Kiki Bertens, who saw off Australian qualifier Daria Gavrilova 6-3 6-3, in Saturday's semi-final on the red Foro Italico clay.
"Today was a good match, but I can say that I could finish earlier in the second set," said Halep, who raced to a 3-0 lead in the first set and broke Kontaveit in the opening game of the second before winning.
"But she turned it a little bit around ... she came back for a few games, and she played really, really well."
Results from the Italian Open women's quarter-finals
- 3-Garbine Muguruza Blanco (Spain) beat 9-Venus Williams (U.S.) 6-2 3-6 6-2
- 8-Elina Svitolina (Ukraine) beat 2-Karolina Pliskova (Czech Republic) 6-2 7-6(9)
- 15-Kiki Bertens (Netherlands) beat Daria Gavrilova (Australia) 6-3 6-3
- 6-Simona Halep (Romania) beat Anett Kontaveit (Estonia) 6-2 6-4