Enum son stuctos y, por lo tanto, se asignan en la pila, mientras que las uniones discriminadas son tipos de referencias, por lo que se asignan al montón. Por lo tanto, esperaría que DU fuera un poco menos eficiente que las enumeraciones, aunque en realidad probablemente nunca notará esta diferencia.
Lo que es más importante, una unión discriminada solo puede ser uno de los tipos declarados, ya que las enumeraciones son solo un entero, por lo que podría convertir un entero que no sea miembro de la enumeración enum. Esto significa que cuando coinciden los patrones, el compilador puede afirmar que la coincidencia de patrones está completa cuando cubriste todos los casos para un DU, pero para una enumeración siempre debes poner un caso de captura por defecto, es decir, para una enumeración. Siempre necesitará la coincidencia de patrones como:
match enumColor with
| Red -> 1
| Green -> 2
| Blue -> 3
| _ -> failwith "not an enum member"
donde como el último caso no sería necesario con un DU.
Un último punto, ya que las enumeraciones son soportadas nativamente tanto en C# como en VB.NET, ya que las DU no son, las enumeraciones suelen ser una mejor opción cuando se crea una API pública para el consumo en otros idiomas.