Often using a lineup fractured because of injuries, Michigan State found the right combination in the East Region final.
"I can't tell you how enjoyable it is because I know what these guys have been through," Michigan State coach Tom Izzo said.
Kenny Goins hit a go-ahead, 3-point basket with 34.3 seconds remaining as second-seeded Michigan State eliminated top-seeded Duke 68-67 in a classic Sunday at Capital One Arena in Washington.
After Goins' basket, Duke's RJ Barrett was short on a 3-pointer, but the ball went out of bounds off the Spartans with 8.4 seconds remaining.
Barrett was fouled on a drive at the 5.2-second mark. He missed the first and made the second.
Duke never got the ball back.
"They hit a big shot and then we came down and we're able to score," Barrett said.
Michigan State (32-6), with a nine-game winning streak, meets third-seeded Texas Tech in Saturday's Final Four semifinal in Minneapolis. It's the first Final Four for the Spartans since 2015, and the eighth under Izzo.
"These guys, they earned their way," Izzo said. "I wish you could see the work they've put in."
Cassius Winston scored 20 points to go with 10 assists and Xavier Tillman had 19 points for the Spartans. Goins finished with 10 points, including 2-for-8 on 3s.
"It was an amazing game," Duke coach Mike Krzyzewski said. "I thought the difference was Winston. He made big plays, either scoring or assisting."
Zion Williamson's 24 points and 14 rebounds and Barrett's 21 points paced Duke (32-6), with its freshman-laden star power unable to pull off another dramatic victory. Javin DeLaurier provided 10 points and 11 rebounds.
"I'm not really looking back at the moment," Williamson said. "We just lost the game, obviously, so trying to get through that emotion first."
The Blue Devils were ousted in a regional final for the second year in a row.
Duke, which wiped out a four-point hole with seven straight points down the stretch, ended up with 17 turnovers.
The teams staged a back-and-forth second half.
Winston scored on a runner and Tillman added a three-point play in transition for a 63-59 edge.
Barrett's 3-pointer with 2:29 left represented the 15th lead change as the Blue Devils took a 64-63 edge.
Williamson scored on a drive on Duke's next possession. Tillman's lay-in cut it to 66-65 with 1:17 remaining.
Barrett missed at the other end, with Michigan State calling timeout with 43.6 seconds left before Goins connected.
Michigan State led for most of the game's first 10 minutes before Duke's 12-0 run sent the Blue Devils to a 30-21 lead. Barrett had 12 points by that stage.
But after Williamson was called for his second foul, the Spartans scored the next 13 points to lead 34-30 at halftime. That meant Duke had a scoring drought of 5:23 to end the half.
The run became 15-0 until Duke scored on its second possession of the second half.
Michigan State was 2-for-11 on first-half 3s, but Duke was only 3-for-10. The Blue Devils were mostly hurt by 10 turnovers before the break.
Freshman Cam Reddish was the first reserve used by Duke. He missed Friday night's game with what was described as a knee ailment. Reddish had eight points on 2-of-8 shooting.
Duke had won the last seven meetings with Michigan State.
--Field Level Media