If you consider dlsym & co too hacky consider putting this in the bridging header:
unsigned char* swift_demangle(const unsigned char* name, long length, unsigned char* buffer, long* bufferSize, int flags);
Then you can call it from Swift normally:
func demangle(_ mangledName: String) -> String {
let string = swift_demangle(mangledName, mangledName.count, nil, nil, 0)!
let result = String(cString: string)
string.deallocate()
return result
}