Born in Duluth, Georgia, Duvall played his club soccer for the Concorde Fire before joining the Wake Forest Demon Deacons in 2010. Duvall was a four-year starter for Wake Forest and played in 74 games and had one goal and 11 assists in his collegiate career.
On January 16, 2014 Duvall was selected with the 22nd pick by the New York Red Bulls of Major League Soccer in the 2014 MLS SuperDraft. He made his debut for the team on May 17, 2014 against Toronto FC, coming on as a halftime substitute for Kosuke Kimura as the Red Bulls lost 2–0. Duvall then made his first professional start the next week on May 24 against the Portland Timbers. The Red Bulls went on to lose 2–1. After a few more impressive displays Duvall emerged as the team's starting right back appearing in 22 official matches in his rookie campaign. On June 28, 2015 Duvall scored his first goal as a professional helping New York to a 2-1 lead, in a 3-1 derby victory over New York City FC. A few days later, on July 1, 2015 Duvall helped the Red Bulls to a victory in the U.S. Open Cup over another local rival New York Cosmos, drawing a pk during the match which was converted by Sacha Kljestan in a 4-1 victory. However, Duvall suffered a harsh tackle in the waning moments of the match which resulted in a broken right leg, keeping him out of action for the next few months. Due to various injuries to New Yorks central defenders, Duvall was converted to center-back during the early part of the 2016 season and started the match at center-back for the club in a 7-0 Hudson River derby victory against New York City FC on May 21, 2016.
On December 17, 2018, Duvall was traded to the Houston Dynamo in exchange for a third-round pick in the 2020 MLS SuperDraft. He made his Dynamo debut on June 11 in a 3-2 win over Austin Bold in the US Open Cup. He would appear in his only MLS match with the Dynamo on June 29, a 2-1 defeat to the New England Revolution. Duvall struggled to get playing time and spent time with the Dynamo's USL Championship affiliate Rio Grande Valley FC throughout the season. On August 6, 2019, Duvall was waived by Houston.
On September 21, 2019, Duvall joined USL Championship side Oklahoma City Energy for the remainder of their season. He made his Energy debut on September 22 in a 0-0 draw with Sacramento Republic.
Portland Timbers
On February 25, 2020, Duvall signed a contract with Portland Timbers for the 2020 season.