The Spaniard, ranked 12th in the world, will face American John Isner for the title. The fifth seeded Isner defeated champion Juan Monaco 1-6 6-4 6-4, avenging his loss in last year's Houston final to the Argentine.
Almagro won eight of the first 11 points in his match with first-time semi-finalist Williams. He broke Williams five times.
"I think I played better than yesterday," Almagro said. "I'm very happy with my game."
Isner dropped the opening set to Monaco in 33 minutes before the momentum shifted.
"Even though I got creamed in that first set, I felt I was playing pretty well. My serve wasn't really on," said Isner.
"But I was making a lot of returns and so I told myself I was in the match. I just had to try and find a way to break through on his serve.
"I served smart, got myself out of (some) jams the rest of the match."
Isner fired nine aces in the match, bringing his total to 57 through four matches and is three short of the tournament record of 60 set by Pete Sampras in 2002.
- Sports & Recreation