Eliminar todos los nodos vacíos / innecesarios de HTML

¿Cuál sería la forma preferida de eliminar todos los nodos vacíos y innecesarios? Por ejemplo

<p></p> debe ser eliminado y<font><p><span><br></span></p></font> también debe eliminarse (por lo que la etiqueta br no se considera innecesaria en este caso)

¿Tendré que usar algún tipo de función recursiva para esto? Estoy pensando en algo como esto tal vez:

 RemoveEmptyNodes(HtmlNode containerNode)
 {
     var nodes = containerNode.DescendantsAndSelf().ToList();

      if (nodes != null)
      {
          foreach (HtmlNode node in nodes)
          {
              if (node.InnerText == null || node.InnerText == "")
              {
                   RemoveEmptyNodes(node.ParentNode);
                   node.Remove();
               }
           }
       }
  }

Pero eso obviamente no funciona (excepción stackoverflow).

Respuestas a la pregunta(1)

Su respuesta a la pregunta