ウィジェットブループリントが残ったままになってしまう

Execピン(白)を持つ関数ノードは、最後に実行したときの結果を保持しています
そしてその参照を解決するタイミングは、別のノードから参照されたとき、となります
このあたりはなんとなく想像がつくかと思います
まずはこの仕様を認識してください

この点は同一フレームで処理している際にはほとんど問題になりませんが、Delay等のLatentノード(時計のマークが付いたノード)を併用した場合に問題になることがあります
Latentノードが入った場合、それ以降のノードは別のフレームにて処理されることになります
つまり、ひと続きの処理ではなくなったので、別の処理に割り込まれる可能性が発生するわけです

今回の場合ですと、まずCreateWidgetし、AddToViewportしたあとにDelayを挟み、RemoveFromParentという流れになっています
AddToViewportのあとに0.5秒のDelayが指定されたので、一旦そこで処理が中断されます
しかしその直後、その0.5秒の間にもう一度CreateWidgetが実行されました

ここで最初の記述内容を思い出してほしいのが、 関数ノードは 最後 に実行したときの結果を保持している、という点です

1度目に作成したWidgetをWidgetAとしましょう
WidgetAをAddToViewportした後、Delayに入ります
この間で、もう一度CreateWidgetが呼ばれ、WidgetBが作成されます
この時点で、CreateWidgetは、WidgetAの情報を忘れ、最後の結果であるWidgetBの情報を保持することになります
その後、Delayで先送りにされた処理が実行されます
RemoveFromParentはCreateWidgetの結果を参照し、WidgetBを画面から消します

さて、このときWidgetAはどこにいるかというと、RemoveFromParentで消されなかったため、画面上に残っています
これが、画面上にWidgetが残ってしまう原因です

以上が、ボタンを連打した際に起こっている内容になります
ボタンをゆっくり押した場合(0.5秒以上の間隔を開けた場合)は上記のようなことが起こらず、想定どおりに動作しています