Keenum went 8 for 17 for 70 yards and Savage went 8 for 12 for 43 yards as they compete for the backup job behind Ryan Fitzpatrick.
"Even though tonight was not a great night, it is a body of work and there has been some decent play from those guys, so we are comfortable," coach Bill O'Brien said.
He didn't say who had the advantage to take the job, but Keenum has been listed second on the depth chart throughout camp.
"We will always do what is best for the team ... but as it relates to those two guys, they have shown flashes of good things and some not so good things, just like everybody else," O'Brien said.
San Francisco's Chris Borland, a third-round pick from Wisconsin, returned an interception 34 yards for a touchdown, third-string quarterback Josh Johnson threw three TD passes to the 49ers to the win.
Borland is one of the linebackers in the mix to replace injured NaVorro Bowman. Bowman is expected to miss at least half the season as he recovers from a devastating left knee injury sustained in the NFC championship game loss to the rival Seahawks.
Michael Wilhoite is listed as the starter, but defensive coordinator Vic Fangio said younger players would get a "good, healthy dose of snaps" to move up the depth chart.
Keenum got the start and started 2 for 7. He got the Texans moving on his third series, completing three passes to DeVier Posey.
Keenum wasn't available to reporters after the game.
Gabbert started 1 for 4 and was sacked by outside linebacker Whitney Mercilus on the second-to-last play of the first quarter. Mercilus, a late first-round pick in 2012 now backing up Jadeveon Clowney, tackled LaMichael James behind the line on the next play.
Savage, a fourth-round draft pick, started the second quarter for Houston and completed his first six throws. His first miss was a third-down toss to Mike Thomas and Bullock kicked a 52-yard field goal for a 6-0 lead.
Keenum returned with 1:12 left in the half and the ball at the Houston 19. He threw behind Posey and Chris Cook intercepted and returned it to the Houston 13. Johnson threw a touchdown pass to Bruce Ellington on the next play.
"It's just anticipation," Savage said. "I've just got to get the ball out quicker. I think it was the right read, it was just the ball has got to be out and that's something I can definitely improve on."
Texans rookie Andre Hal intercepted Johnson's pass and returned it 77 yards for a touchdown late in the third quarter.
Nose tackle Ian Williams, center Daniel Kilgore and right guard Joe Looney were the only San Francisco first-teamers to start, and Wilhoite and fullback Bruce Miller were the only other regular starters who played. Wilhoite only played on special teams.
Carrier left the game with a hamstring injury.
Notes: Kaepernick finished the preseason 12 for 22 for 115 yards. ... Texans RG Brandon Brooks was the only first-team offensive player to start. NT Jerrell Powe and defensive end Jared Crick were the first-team starters on defense for the Texans. ... Texans CB Johnathan Joseph and RB Arian Foster missed all four preseason games.
AP Sports Writer Chris Duncan contributed to this report.