I wrote a simple IDA plugin that, after a function call, looks for mov MEM_LOCATION eax and adds a name for the memory where the return value is stored. I limit my search to only a few instructions after the function call and bail out if I see another call before the return value is stored. Is there a more rigorous way to track where the return value goes besides these heuristics?
Tracking What Is Done With a Function's Return Value
ida
In the static context, this is known as data flow analysis.  For example, Hex-Rays incorporates the return-location information for function calls into its representation of the function so as to determine into which other locations that data flows.  You don't give a lot of detail on what you want to do with this information, but off the top of my head I'd say it could be worthwhile to investigate writing a Hex-Rays plugin.