Chris Johnson, Jonny Gomes and Ryan Lavarnway all had an RBI for the Braves, who snapped a season-worst six-game losing streak while winning for just the second time in the last 15 road games to avoid a four-game series sweep.
The Braves haven't been swept in a four-game series in Philadelphia since Sept. 2-4, 1949.
Morgan (2-3) surrendered four runs and seven hits in five innings in his seventh career start.
"When you don't have command of your fastball, it's tough," Morgan said. "I feel a little out of whack, but I'm not pressing the panic button. Mechanic-wise, I'm looking forward to working on it the next five days and go from there."
Interim Phillies manager Pete Mackanin said Morgan was battling early in the game when the Braves hit him hard without anything to show for it. But the command finally caught up to him when Atlanta scored four runs in the fifth.
"He didn't have real good command of his fastball and he got hurt," Mackanin said. "He was squeaking through it. When you don't have good command of your fastball, you can't do anything else even with your secondary stuff. And that was the case with him today. He just wasn't sharp."
Ryan Howard had two hits, one a double, for the Phillies, who lost for just the third time in 15 games since the All-Star break.
"On a good note, we took three of four," Mackanin said.
Teheran (7-6) earned his first road win since his season debut on April 6 at Miami.
The right-hander was 0-6 with a 7.88 ERA in his last 10 starts away from home entering Sunday. But he cooled the Phillies, striking out seven and walking none while giving up two runs and eight hits.
"He had command of all his pitches on both sides of the plate," Braves manager Fredi Gonzalez said.
Atlanta took the lead in the fifth, highlighted by Peterson's drive over the wall in right field. It was the fourth homer of the season for Peterson. Johnson had tied the game at 1 earlier in the frame with an RBI single to center.
Philadelphia got a run back in the bottom of the inning, pulling within 4-2 on Odubel Herrera's RBI single before the Braves scored two more in the seventh on RBI hits by Gomes and Lavarnway.
Howard is 7 for 11 with two doubles and five RBIs in his last three games.
Domonic Brown tied a Phillies' record for a right fielder in a nine-inning game with nine putouts. He had to battle a difficult sun for many of the outs.
"I was impressed by the fact Brown fought that sun," Mackanin said. "He wasn't going to let it get to him."
Teheran improved to 5-3 with a 2.56 ERA in 10 career games, nine of which have been starts, against Philadelphia. Since 2014, he has a 1.21 ERA against the Phillies, allowing only six earned runs in 44 2-3 innings.
Braves: SS Andrelton Simmons (sprained right thumb) didn't play. His replacement, Daniel Castro, went 1 for 4 with a double. ... Williams Perez was hit by a pitch in the right foot in the third inning, causing him to go to the ground in apparent pain. Perez stayed down for a while before walking off the injury and remaining in the game.
Phillies: 2B Chase Utley went 2 for 3 with a walk at Triple-A Lehigh Valley in his first rehab game since being placed on the DL on June 23 with right ankle inflammation. Utley will continue his rehab on Tuesday and Wednesday for Double-A Reading in Trenton, New Jersey Mackanin didn't indicate whether Utley would unseat Cesar Hernandez and go back to his regular starting role at second base, but he said Utley would play upon his return. "I'm not going to dump Chase Utley on the bench," Mackanin said. "He's got value and he's got a lot left."
Braves: Atlanta returns home Monday for the first of seven games at Turner Field when Braves RHP Mike Foltynewicz (3-3, 5.04) faces Giants RHP Matt Cain (2-2, 4.50).