I think what you need to do is choose DSCP tagging scheme that makes use of WMM "properly" unfortunately, that's not so trivial to do. Some day we may get control of this in OpenWrt hostapd, but for the moment, we can only use the "default" that the driver uses.
https://wireless.wiki.kernel.org/en/developers/documentation/mac80211/queues?s[]=wmm
If you can make heads or tails of that, you'll see some things, like for example CS3 and CS0 are both Best Effort, CS1 and CS2 are BULK, while CS4 and CS5 will be "video" and CS6 and CS7 will be Voice.
Your rule to tag udp almost every port as CS6 will cause websites using QUIC protocol to dominate the VOICE queue, which causes you to lose a lot of bandwidth. the VOICE queue is very good for low bandwidth latency sensitive stuff, like voice or game controls but if you put general surfing through it it will screw things up. Chrome uses QUIC, I'm not sure if other browsers do. But in general I think it's a bad idea to put all your UDP through the voice queue.
I'd suggest to start by tagging everything by default CS3, identify game and voip stuff and tag CS5, and identify bulk stuff and tag CS1. Bulk can be usually identified by conntrack bytes (total transfer statistics) any stream that transfers more than say 10 seconds worth of your full bandwidth allotment should be converted to CS1.
what games and voip type traffic do you use? If you have a console for example I'd just tag everything to or from that device CS5 as first approximation (though you could maybe do just all UDP).
EDIT: sorry, tag game and voip stuff CS6. Ideally you'd do something like CS4 for YouTube or IPTV streams, but they can be hard to identify. In order to do that stuff I use an explicitly configured squid proxy which lets it decide based on the domain name what tag it should put on the packet.
EDIT2: also, although you have the same software on your two builds, the devices use different hardware and therefore different drivers, I'm suspicious you're tickling a driver issue.