Tim Scott returned an early fumble 10 yards for the tone-setting score. The Tar Heels (6-5, 4-3 Atlantic Coast Conference) led 38-7 in earning bowl eligibility while wrapping up the Coastal Division title for Georgia Tech.
Anthony Boone was 22 of 40 for 262 yards with two touchdowns for the Blue Devils (8-3, 4-3). They needed to win their last two to earn a second straight ACC title game berth.
The Tar Heels scored 21 points off Duke's three turnovers. Duke managed 378 total yards against a defense that allows an ACC-worst 512 per game.
T.J. Logan rushed for 116 yards and a 1-yard touchdown, and Ryan Switzer caught three passes for 109 yards. The Tar Heels reached the six-win mark for the second straight year and seventh time in eight years while beating Duke for the first time since 2011.
The offense kept clicking behind Williams, who had 98 yards rushing and has accounted for eight touchdowns in six days - he rushed for three and threw for another TD while beating Pittsburgh on Saturday. North Carolina rolled up 591 total yards - three shy of Duke's season worst.
After Duke temporarily got back in the game on Boone's 10-yard scoring pass to Issac Blakeney, the Tar Heels broke off big plays to set up a couple of short touchdowns that put this one away.
Logan's 47-yard run to the Duke 1 led to the Wiliams-to-Hollins scoring pass that made it 21-7.
On the next drive, Williams' 45-yard pass to Switzer came four plays before his quarterback sneak made it 28-7 not even 2 minutes into the second quarter. Logan added his TD midway through the third.
The Tar Heels have 23 takeaways this season with at least one in every game. The Blue Devils, who entered as the ACC's most careful team with the ball, now have six in their last two games, both losses, with their opponents scoring 38 points off them.
Just as in last weekend's 17-16 loss to Virginia Tech, that was the theme of this one.
Short-yardage QB Thomas Sirk fumbled on Duke's first possession and North Carolina went 78 yards on its first scoring drive, which ended on the touchdown pass to Davis.
Boone fumbled two plays later, giving Scott an easy scoop-and-score that made it 14-0.
Boone also had an 18-yard touchdown pass to Jamison Crowder and Sirk added a 1-yard scoring run after the outcome had long been decided.