If I want to find out which address a name resolves to, say example.eth, does this mean I need to send a transaction to the appropriate ENS contract for resolution? Does running a local node reduce this to a call, thereby eliminating gas cost? Are there any cached resources for lookups and resolutions?
I'm not sure if i understand the question.
If you want to resolve a name you just have to call the resolver() method is the ens smart contract,passing it the namehash of the domain name,then if a resolver exist for that namehash just call the addr() of the designated resolver again passing the namehash.You are right in that since it's just a call and not a tx there is no associated gas cost. i'm not aware of any other way to do it,afaik there aren't any cached services/lookup tables where you can get the corresponding address without interacting wit the ens contract.
You can also see all the steps needed by using https://mycrypto.com/contracts/interact then inputing the contract address for the ens: 0x314159265dD8dbb310642f98f50C066173C1259b copy the ABI and call the resolver function.