I wouldn't compare it to the average self-time per call but, rather, the total self-time for the function. Sampling is showing you that most of the CPU is consumed by function foo().Callgraph can show you how you got there, i.e., which functions called foo(). Then, look at the callers and the distribution of the calls to foo() using the Call List tab of the callgraph view.
Also, realize that callgraph skews the timing due to instrumentation. So, the times are not "real" time, but can be used to compare the function timings relative to each other.
Sampling is accurately identifying the most time consuming functions. Now, use callgraph to determine which function(s) are calling that function the most to determine if you can optimize how you use this function.