This kind of optimization is so minimal as to be negligible. Either <<>> or "" will be basically nothing in terms of processing speed. The atom undefined should usually not be used in regards to an "emit" value if only because <<>> or "" says "emit an empty string", while 'undefined' being an atom is slightly semantically different: do you want to emit the text 'undefined' or do you want to emit an empty string?
As for ?WF_IF, it's lazy. It's mostly an alias to case expression wrapped in a Fun (to prevent variable leaking), which means the raw case expressions will be slightly faster:
So with ?WF_IF(false, 1, do_something()),
do_something() will not be called.
-Jesse