up:: UE5.0.2
source:: Function vs Macro What is better? - 2 by eXi - Blueprint - Unreal Engine Forums
source:: UE4 マクロでワイルドカードを使って等価比較ノードを作る - Let’s Enjoy Unreal Engine
source:: UE4 マクロマジック!ちょっと深いマクロのお話 - Let’s Enjoy Unreal Engine
source:: UE4 関数ライブラリとマクロライブラリの上手な活用|株式会社ヒストリア
source:: UE4 イベント・関数・マクロ・インターフェイスの違いと使い分け - GameProgrammar’s Night
source:: 第17回 カスタムイベントを作ってみよう
source:: Pure & impure functions. The concept of pure and impure nodes… | by Morva Kristóf | Advanced Blueprint scripting in Unreal Engine | Medium
source:: Functions vs Events in Unreal Engine 4 | PixelSapiens
source:: Thinking of the thread problem in UE4/How is the delay in UE4 implemented - Katastros
source:: What are the differences between using a custom event or a function? They seem to work the same. : unrealengine

マクロ

折りたたんでるのと処理は変わらない。
入出力ピンを複数持てたり、型情報を持たず何でも入力できるワイルドカード変数を持てたり、それ自体を見るならマクロのほうが高機能。
呼出し時は関数のように外部から呼び出すのではなく、マクロノードの配置場所に展開するのでほんのちょっとだけ早いらしい。とはいえそれは単体の話で、マクロinマクロからのBlueprintコピーとかやると一つのノードの記述量が増えすぎて重くなる。
また、その関係上戻り値はキャッシュされない。ここはPure関数に近い。

さらに、マクロはローカルに情報を残す。つまり、次に呼び出したときもローカルの値情報は残したままになる。マニアック情報かと思いきや、ForEachマクロの実装にこの仕様を使ってたりする。Sequenceノードを合わせることにより、一回マクロ外に出てからSequence、つまりマクロ内に戻す。

ローカル変数の使用には一癖あり。Local Intなどとしてノードとして置く。
値を入れたいときはAssignノードを使用する。

source:: Local Variables in Macro - 5 by Praxinos_Fabrice - Feedback for Unreal Engine team - Unreal Engine Forums

関数

Blueprintの外から呼び出せる
ブレークポイントが置ける
ディレイなど時間がらみノード(Latentノード)が使えない
戻り値がキャッシュされるので、他の様々なノードに戻り値を使っても、再計算の時間はかからない。(Pureは別)

カスタムイベント

戻り値、ローカル変数は無い。そもそも他と違って非同期処理。そりゃ戻り値返せませんわ。別スレッドでやってるかどうかは公式情報ないけど、対応プラットフォームの幅を考えると同スレッドだろうと思う。
また、他のブループリントからディスパッチャーで呼べたりとかなり毛色の違うやつ。非同期の強みを生かしたいときに。

まとめ

つまり基本的に関数で、他じゃないとできないことだけ他にすればいいんじゃないかな。

ちなみに、それぞれまとめた関数ライブラリやマクロライブラリというものも作れる。