However, I don't think this is behaving sanely in pg_dumpall. AFAICT, pg_dumpall does not pass --clean to pg_dump (in other words it only emits DROP for the global objects, not the objects contained inside databases), so passing --if-exists results in failures. Therefore I think the solution is to not pass --if-exists to pg_dump at all, i.e. keep it internal to pg_dumpall. But maybe I'm missing something.
I am looking to pg_dumpall code, and I am inclined to don't pass --if-exists to pg_dump too.
-c, --clean for pg_dumpall means "drop databases"
<<<<<
Usage: pg_dumpall [OPTION]...
General options: -f, --file=FILENAME output file name -V, --version output version information, then exit --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock -?, --help show this help, then exit
Options controlling the output content: -a, --data-only dump only the data, not the schema -c, --clean clean (drop) databases before recreating >>>>>