It is not mandatory to use a UF as there are several potential topologies to push and pull data into your Splunk Indexer(s).
It really boils down to your particular data source & architectural requirements.
1) UF on each server
2) Dedicated UF instance where a UF can not be installed ie: to receive and load balance syslog feeds from network devices or to open up privleged ports
3) No use of a UF...raw feeds to TCP/UDP socket inputs on the Indexers, syslog, scripted inputs that remotely poll your sources, rsynced log files to your Indexers etc...
Universal Forwarders are certainly a best practice to data collection and can further augment your architecture with load balancing, data cloning, compression, encryption, indexer acknowledgement,throttling, centrally configurable using Deployment Manager etc... I certainly try to use a UF wherever it is possible, but if not possible, Splunk has many other avenues for Indexing your data.
This should help :
http://docs.splunk.com/Documentation/Splunk/latest/Data/WhatSplunkcanmonitor
... View more