Если вы уже находитесь в нужном узле и не возражаете, все пробелы превращаются в один пробел:
var htmlNodes = htmlDoc.DocumentNode.InnerText;
var normalized = Regex.Replace(htmlNodes.Trim(), @"\s+", " ");
Поиск в листовых узлах,это сохранит пробелы в непробелах внутри элемента без изменений (например, если у вас было <div><a><span></span>this needs space</a></div>
):
var leafNodes = htmlDoc.DocumentNode.Descendants()
.Where(x => !x.ChildNodes.Any());
var trimmedInnerText = leafNodes.Select(x => x.InnerText.Trim())
.Where(x => !string.IsNullOrEmpty(x));
var outputString = string.Join(" ", trimmedInnerText);