drupal_static and cache_set combo , is this overkill?
I don't see this a overkill.

drupal_static() caches results over the lifetime of a single request.  It is typically used for things that may be needed several times during page generation, but will (likely) not change.  For example, if a node is loaded, it gets saved in memory in case multiple functions need it.

cache_set() / cache_get() caches things in the database (or another storage backend with the proper module), so the data persists (up to the TTL) between page requests.  This gets used for things that change infrequently, and is global for all requests.  As far as I can remember, the normal implementation always goes out to the cache backend and doesn't store results in memory with drupal_static() or static.

Given the overhead, I would be judicious as to whether caching really improves things.