BFD and NSF accomplish two separate goals and are not mutually exclusive. As the name implies, BFD is used to detect a bidirectional forwarding issue when link status cannot be used to detect a failure. In the case of the L3 links from distribution to core - these are likely P2P links, so if one side were to be down, the other side would also be down. BFD would not help in this instance because link status is end to end - detection would be interrupt driven and much faster than BFD. However, if there were a switch in-between your L3 links, link status would not be end to end and you would need to rely on your protocol timers to detect the failure. You would use BFD in this case to detect the failure and notify the protocol that the adjacency should be torn down.
As far as timers, you will likely not find a recommended value as it really is dependent on your environment and use case. Faster timers will detect failure faster but at the expense of overall stability. I have typically used a 1 second hello interval with a multiplier value of 3 or 4. I have not found the need to tune timers any less than that.
Check out
BRKDCT-2333 "Data Center Network Failure Detection" is a good resource for BFD and other failure detection mechanisms.
NSF is used to prevent topology change after a supervisor switchover. A control-plane switchover on a non-NSF capable device would require the L3 adjacencies to be re-established which results in topology change and temporary loss of connectivity until the network converges. NSF allows traffic to continue being forwarded along the old path while the adjacencies are gracefully refreshed after switchover. The remote device must be NSF aware for the process to work.
The book Optimal Routing Design provides a good explanation of how NSF works for a number of protocols.
Hope this helps.
Eric