Charles Brown also came up with a key interception late in the third quarter as part of a dominating defensive performance for the Tar Heels (6-3, 2-3 Atlantic Coast Conference), who shut down Thad Lewis and the prolific passing attack that had carried the Blue Devils (5-4, 3-2) to three straight victories.
Duke finished with 125 total yards and had to fight for every one of them. The Tar Heels didn't have much offensive success, but they wore down the Blue Devils behind Houston after starting tailback Shaun Draughn went out with an early shoulder injury.
Houston finished with a career-high 37 carries, including 10 on the clock-draining drive that ended with Boyd's touchdown with 6:57 left.
He also had the lead block on Matt Daniels that allowed Boyd to get to the right pylon on a 3-yard end-around that made it a two-possession game.
Not a bad performance for a guy who typically served as the short-yardage and goal-line back and had never had more than 18 carries or 74 yards rushing in a game. Then again, the Tar Heels didn't have much choice after Draughn injured his left shoulder on a 9-yard gain on the Tar Heels' first offensive play and didn't return.
North Carolina didn't manage much offense outside of Houston.
T.J. Yates threw for just 119 yards and the Tar Heels had to rely on a career-high four field goals from Casey Barth.
But they're now one win from bowl eligibility -- though their last home game is next week against No. 16 Miami, followed by trips to Boston College and rival North Carolina State to close the regular season.
It was the first meeting in 15 years in which both North Carolina and Duke had winning records, while it was one of the rare times in the rivalry that they weren't meeting to close the regular season. But it ended much like the rest have, with North Carolina winning for the 19th time in 20 meetings.
The game remained tight until the final period despite the fact Lewis was under constant pressure and didn't have time to wait for his receivers to get open.
He completed 16 of 33 passes for 113 yards, snapping his streak of four straight 300-yard games. His biggest mistake came when he tried to force the ball to Conner Vernon late in the third quarter only to see Brown jump in front of the pass and return it 54 yards. That set up Barth's 41-yard kick for a 9-6 lead on the final play of the third quarter.