Particle.publish() took very long time up to ~12+ s to return

Yes. You can try using “NO_ACK” in your Particle.publish() statement. Sorry for the double post of the link, but, it is a helpful writeup by @rickkas7 about this parameter and others:
https://community.particle.io/t/particle-publish-and-blocking/42022

also, here is a link to the docs with more information about “NO_ACK”:
https://docs.particle.io/reference/device-os/firmware/argon/#particle-publish-

Instead of Particle.publish() I utilize publishQueue.publish() whenever possible. You will need to install the library, PublishQueueAsyncRK, to use it but the results are non-blocking. For example:

publishQueue.publish("xyz sensor", "does NOT exist", PRIVATE, WITH_ACK);

will not block while the “WITH_ACK” is dealt with. There is a link near the top of this thread for more info about the library.