With the XBee Pro (series 1), with one end being an external 5.6dBi antenna, elevated to about 20 ft. I got 3/4 mile range with low error rates. The far end was an XBee with the little PCB chip antenna.
This was a line of sight situation.
If the XBee with the PCB antenna is on a person, and that person’s body blocks the line of sight path, you will lose about 6-12dB of signal strength. This is OK if the other end’s antenna gain and the path length is such that the signal is still usable. The XBee and most all 802.15.4 radios do work well at -90dBm and weaker signal strengths.
At weak signals, you will need error correction beyond what is inherent in 802.15.4. It, like WiFi, uses an ACK timeout at the transmitting end. If this times out, the sender re-sends n times before giving up. Your application must deal with exhausting retries - either ignore or wait a bit and try later.
The amount of time for an ACK timeout may affect your application. You may need to shorten the default timeout setting - this is a register setting (AT command, or API mode).
100 sample/sec. You are probably aggregating samples so that you are transmitting far fewer packets, say, 10 per second at most, right? 100/sec isn’t reasonable with '15.4. Each '15.4 frame can hold about 100 bytes.
You could write your own relay/forwarding code, simple, if the routing is unchanging over time. To the contrary, you may need true mesh networking (ZigBee or other), but these wouldn’t reconstruct routes at the speeds you are talking about.
So the answer for you is probably to have the moving nodes send to a broadcast MAC address. There are no ACKs. Put multiple receiving nodes around so that at least one will get enough line of sight. Use good antennas on these, maybe even directional panels or a 5.6dBi omni (8 in).
Your transmitters need to code their packets so the receivers can forward data on RS232 or ethernet links to a data ingester program that can ignore duplicate data.