While Bence is correct, you have also asked
I have been reading device documents to find out where the data I want
to collect is stored in registers, but I never felt like I understood
the location decisions that were being made to create the Modbus
servers
The only way to find where the data is located in the registers is through the documentation provided with the device.
Now talking about the decision, about where to place which data, consider the following example,
You have a temperature controller which provides you with the following data,
1. On/Off status
2. Temp Set Point
3. Actual Temp (typically called process value)
Then,
On/Off Status:
If you want to allow external device/software to turn the device on/off then you would place it inside coils else if you just want to inform the users about the on/off status then you would place it in contacts making it read only thus restricting external control.
Set Point
Typically you would want an operator to change the set point and this value would need more than a bit so this would be placed in a holding register so you can read and write into it.
Actual Temp
this is something which is always read-only as you are reporting the actual sensed temperature and so should be placed in an input register.
If you want to integrate MODBUS communication into your software try NMODBUS which is a free MODBUS library and has worked great for me.
https://github.com/NModbus/NModbus
Hope that helps.