Are bech32 and base58 the only formats that a Bitcoin address can use or is there another?
Sort of. All legacy output types use base58check (which uses the base58 encoding and adds a checksum) in their address encoding. Native segwit v0 outputs use bech32 addresses, while native segwit output v1 (P2TR) use the bech32m address encoding which is a slightly modified version of bech32. Future output types will likely also use bech32m.