Narveson was originally drafted out of T.C. Roberson High School by the St. Louis Cardinals in the 2nd round of the 2000 MLB Draft. He remained in the Cardinals' farm system through 2004, including appearing in the 2003 All-Star Futures Game for the USA Team.
Narveson returned to the Cardinals on August 8, 2005, when they selected him off waivers from the Red Sox. He made 15 starts in 2006 for the AAA Memphis Redbirds with a 2.81 ERA and was called up to the big leagues for the first time when rosters expanded in September. He made his Major League debut by working 2 innings of relief on September 8, 2006 against the Arizona Diamondbacks, allowing two earned runs. Made his first start on September 22, 2006 against the Houston Astros but only lasted 4 innings. Overall, he made 5 appearances for the Cardinals in 2006 and had an ERA of 4.82 with no decisions. He only made 12 minor league starts in 2007 due to a left shoulder injury.
Milwaukee Brewers
Narveson signed as a minor league free agent with the Milwaukee Brewers on December 4, 2007 and spent the 2008 season with the AAA Nashville Sounds, where he was 6-13 with a 5.43 ERA in 28 appearances. He was recalled by the Brewers from Nashville on June 14, 2009 and pitched in his first game with Milwaukee on June 15. He was outrighted to Nashville on July 13 after being designated for assignment. He was called up again on August 21 and appeared in a game the next day, earning his first major league win. He entered the Brewers starting rotation on September 13 making a spot start in place of Manny Parra and gained his first major league win as a starter on September 23, striking out 10 in the process. Narveson made the Brewers roster in 2010 with the intention of him being a long distance reliever and a spot starter. However, the struggles of Manny Parra gave Narveson the chance to start and he ended up being the Brewers 5th starter for the second half of the season. Narveson finished the season with a 12–9 record in 28 starts, a 4.99 ERA, and 137 strikeouts in 167.2 innings pitched. Narveson was named the 5th starter on a revamped Brewers starting rotation for 2011. He started 28 games for the Brewers in 2011 and finished with an 11–8 record, with a 4.45 ERA and 126 strikeouts in 161 innings pitched. Narveson just missed starting 30 games on the season, but due to an injury on his left thumb caused by a pair of scissors, Narveson missed 2 of his scheduled starts. Narveson missed almost all of the 2012 season due to an injury to, and surgery on his throwing arm's torn rotator cuff. He had a 1-1 record in 2 starts, with an ERA of 7.00. He was replaced as a starter by Marco Estrada. He became a free agent on October 1, 2013.
Tokyo Yakult Swallows
Narveson pitched in the Tokyo league in 2014, finishing his first season in Japan with a 4-11 record in 24 starts.
Miami Marlins
On December 6, 2014, Narveson signed a minor league deal with the Miami Marlins. He was designated for assignment on April 21, 2016.
Narveson signed a minor league contract with the Cleveland Indians on February 14, 2017 that includes an invitation to major league spring training. Narveson announced his retirement on Twitter on September 3, 2017.