So apparently the eval methods are completely undocumented... Good to know.
Yes; all the eval methods have a cost, but the more specific you can be the better. .evalHas(key) causes the plan to branch such that .evalHas('foo') will have two versions of the plan - one where foo is present, and one where foo is not present. (Compare to .eval() where each individual different object will result in a new plan.)
$__inputStep.evalHas(key): two plans
$__inputStep.eval(): almost infinite plans
$__inputStep.evalLength(): one plan for each length of the list
$__inputStep.evalIs(val): two plans (one where $__inputStep's value === val; and one where it doesn't)
Ref: https://discord.com/channels/489127045289476126/498852330754801666/1205068909787746304