Wie du richtig gesagt hast, erlauben alle drei Paare Gruppen zu erstellen. 
Alle nachstehende Beispiele sind mit plain TeX zu übersetzen.
Es gibt aber gewisse Besonderheiten. So kannst du `{` und `\egroup` kombinieren:
    {\bf Hallo \egroup Welt!
    \bye
Diese Kombination ist mittels `\begingroup`  und `\endgroup` nicht möglich. 
Zudem können als Argumentenöffner (mir fällt kein besseres Wort ein) Argumentklammern `{` sowie `\bgroup`  genutzt werden. Dies zeigt folgendes Beispiel:
    \setbox0=\hbox\bgroup \bf Hallo \egroup
    \setbox0=\hbox{\unhbox0 Welt}
    \box0
    \bye
Somit sind auch makroübergreifende Gruppen möglich, was weder durch `{}` noch `\begingroup` erreicht werden kann. Das nachstehendes Beispiel zeigt dieses:
    \def\startbox{\setbox0=\hbox\bgroup}
    \def\endbox{\egroup\par Die Ausgabe: \box0}
    
    \startbox
      Hallo Welt
    \endbox
    \bye
Natürlich kann aber `\begingroup` und `\endgroup` in den genannten Anweisungen verwendet werden:
    \def\startbox{\begingroup\setbox0=\hbox\bgroup}
    \def\endbox{\egroup\par Die Ausgabe: \box0\endgroup}
    
    \startbox
      Hallo Welt
    \endbox
    \bye
Insgesamt lässt sich also festhalten, dass `{...}` und `\bgroup...\egroup` Argumente gruppieren können.
Die Anweisungen `\begingroup...\endgroup` erzeugen einen Block, und zu jedem `\begingroup` muss ein `\endgroup` existieren.
Besonderheiten:
 - Beachte bitte, dass  `\def\foobar\bgroup` und `\def\foobar{` verschieden sind.
 - `\begingroup` ändert nichts an Eigenschaften, wie folgendes Beispiel zeigt:
        $$ 1\bgroup+\egroup1=x$$
    
        $$ 1\begingroup+\endgroup1=x$$
        \bye
Aufgrund der Eindeutigkeit der Korrespondenz von `\begingroup` und `\endgroup` rate ich zu diesen Anweisungen. Die Kombination von `\bgroup...\egroup` bzw. `{}` sollte man nur anwenden, wenn man sie auch wirklich braucht.
braucht.