Construct a tournament bracket
Charcoal, 92 79 bytes

Ａ¹θＷＳ⊞υ⪫__ιＷυ«Ａ⌈ＥυＬκεＡ⁺θθδＦυ«Ｐ×_εＰκＭδ↓»ＡＥ✂υ¹Ｌυ²⎇‽²κ§υ⁺λλυＭε→Ｆυ«Ｍδ↑↗θ←↖θ→»Ｍθ↘Ａδθ


Try it online! Link is to verbose version of code. Needs a blank line to mark the end of the input. Explanation:

Ａ¹θ


Initialise the variable q. This holds the size of the zig-zags i.e. half the gap between rows.

ＷＳ⊞υ⪫__ι


Read nonblank input lines into the array u. The lines are automatically surrounded by _s as they are read in, although they are not padded yet.

Ｗυ«


Loop while there are still strings left.

Ａ⌈ＥυＬκε


Calculate the width of the largest string in e.

Ａ⁺θθδ


Calculate the gap between rows in d.

Ｆυ«Ｐ×_εＰκＭδ↓»


For each team, print the padding, print the team, and then move down to the next team.

ＡＥ✂υ¹Ｌυ²⎇‽²κ§υ⁺λλυ


For every other team, randomly pick between that team or the previous team. (Note that if there is only one team left then this produces an empty list.)

Ｍε→Ｆυ«Ｍδ↑↗θ←↖θ→»Ｍθ↘


If there are still teams left, draw the zigzags joining them in pairs.

Ａδθ


Double the length of the zigzags each time.