At the C++ level, enums are indeed essentially integers that have text identifiers, and these identifiers only exist at compile time, not runtime.
There are two independent levels of associated data on top of this with UE4 enums however.
The first comes from the reflection system - the string identifier for each value in a UENUM is associated with its value; this information is embedded into code generated by UE4’s build system and is available at runtime in both editor and packaged builds.
The second is metadata (UMETA in this case), which is added on top of the reflection data, but is stripped out in packaged builds.
It would seem (based on info in this thread) that the enum to string conversion node is probably using the DisplayName metadata for each value that has it, but falls back onto the name in the core reflection data (the string of the enum identifier) both for values which don’t have DisplayName metadata specified, and also packaged builds.