I think you’re correct, it would be an issue to call UMG before BeginPlay.
APlayerController’s, APawn’s, APlayerState’s and several other classes are all torn down and rebuilt on any map transition, including loading a map for the first time (of course, they’re just built if it’s the first time), so they’re not valid for a while.
In my projects, if it’s anything that a designer or artist will be involved with (i.e. displaying any UMG), I’ll invoke a Blueprint Event and fire it up the chain. That way, anything like the creation of UMG will almost certainly be done at the correct time.
You can utilise the BeginPlay node in Blueprints, rather than C++ for such items. You can still house a UWidget* pointer in your C++ code and simply set the returned object from a create widget node (although I think that might return a UUserWidget* instead), and so you have access to it in both C++ and BPs.