You're comparing apples to oranges: custom tags and functions are not interchangeable concepts. Whilst they can both be coded to achieve much the same end, it would generally be a poor decision to use a custom tag where a function is appropriate; and equally a poor choice to use a function where a custom tag is a better fit.
Functions are for data manipulation; custom tags are for text / content manipulation. So your functions belong in your business logic, and your custom tags belong in your display logic.
Both have their place.
If you're looping over something 1000 times and calling some functionality 200 times per iteration... that really doesn't sound like you should be using a custom tag (it's not preparing text for output, is it?); it sounds like data-processing, so should be handled by functions (hopefully ones that are encapsulated in objects appropriately...)