I can think of about 10 different ways to do this and I'm not really sure which one would be best for your use case. I think if you do it right, you shouldn't have to maintain things in two separate places.
It's hard to estimate the amount of custom code you'd have to do without knowing the final design. It would be a fair amount unless you extend the modUserProfile object, (and maybe the modUser object as well) which I think is not all that difficult (though I've never done it). Then I think you might be able to use the various parts of the Login and Peoples packages for much of it.
I think Profile and UpdateProfile are fairly flexible and both take preHooks and postHooks so it should be possible to create a custom form for each type of "user" and a small amount of custom code to do the CRUD work in the preHooks and PostHooks.
Another way to go would be to add fields to the Create/Edit User panel and you could use a plugin attached to OnUserFormPrerender and OnUserFormSave to handle the data.
I think I would not use master/detail tables for the relationships, but rather intersect objects (childParent, childCoach, etc.) where each record contains, for example a coach ID and a child ID. Take a look at the modResourceGroupResource, modTemplateVarTemplate, modUserGroupMember, etc. objects here:
http://bobsguides.com/modx-object-quick-reference.html. xPDO is fantastic at handling that kind of setup. It allows you to do things like this:
$coach->getMany('Children');
$parent->getMany('Children');
$child->getMany('Parents');
$child->getOne('Coach');
// or if a child can have more than one coach:
$child->getMany('Coaches');
You might also look at MIGX and MIGXDB for your UI.