Peavy kept Seattle (49-25) off the board through 6.2 innings to outduel the 30-year-old Franklin, leading San Diego to a 3-1 win.
Oakland beat San Francisco to move 5.5 games behind the Mariners.
The Padres took the series from Seattle, two-games to one, and improved their National League worst record to 25-52 in the process.
Franklin (6-5) allowed just two hits and one run in his six innings of work. He didn't allow his first hit until Donaldo Mendez led off the sixth inning with a double. His second hit allowed, a double to Mark Kotsay, put the Padres on the board, ahead 1-0.
After the sixth, M's manager Bob Melvin elected to take out Franklin - who had thrown 84 pitches - and go to the bullpen. It was the first time a Mariners' starter didn't go at least seven innings in the last 11 games.
San Diego added a run in the seventh off of second-year pitcher Rafael Soriano, coming on a Dave Hansen RBI double that scored Ryan Klesko from first base. Klesko, who reached on a single, was going with the pitch and scored easily.
Bret Boone belted his 20th homer of the year in the eighth off of Padres' releiver Jay Witasick to draw the Mariners to within one at 2-1.
But the Padres answered with an insurance run in the bottom half of the inning as pinch hitter Brian Buchanan greeted left-hander Matt White into the game with a solo homer.
Rod Beck picked up his third save as a Padre with a scoreless ninth inning.
Peavy, who allowed only four hits on the day, improved to 8-5.
Despite picking up the loss, Franklin's ERA dipped to 3.18.
Both teams finished with five hits in the game. Boone and Ichiro Suzuki were the only two with two hits on either team.