Note that dlopen() doesn't fix the problem of the giant libsystemd in the first place. It just obfuscates the true dependency graph of libsystemd.
This isn't my area of expertise, but I am curious:
Why doesn't dlopen() solve the problem? As best I understand it, liblzma was able to steal one (or more) of the symbols from libcrypto.so.3 because it ran constructors at a point in time when the GOT was still writable. After loading shared objects is complete, that table is made read-only. If dlopen() is used after the program starts, then even if the library is loaded, it can't steal symbols in the table any more.
Or do I misunderstand this entirely?