Whether or not you'd want separate Swift nodes depends primarily on how much data you expect to keep there. A simple test is to fully populate your Swift object store with data and then fail one controller node. If replication of the degraded Swift objects between the remaining nodes controller generates enough network traffic, CPU load, or disk I/O to have visible effect on performance of other OpenStack services running on the same nodes, you should separate Swift from controllers.