Ok, solved.
Actually the gateway was receiving the packets, so I investigated further and found the forum thread
that gave me all the clues to debug and get to the solution.
In my case it was a frame counter issue: OTAA join resets the frame counters, whereas ABP activation does not (of course). So I had to set the FCU (Frame Counter Uplink) on the Arduino client (to server counter shown in “Device > Activation” +1) before sending the packet, so that server validates and accepts it.
Thank you for your hints.