What we do is have our systems send direct to Logstash, where all the parsing/filtering/reformatting is done before log data are passed on. Putting an rsyslog server between the systems and Logstash seems like it would just add complexity without providing much in the way of benefits unless rsyslog already has modules that can parse and JSON-ize the formats your vendors use.
Filtering log formats turns out to be a bit of an art because of the data flow paradigm that Logstash uses. You need to be aware of the available input plugins and the filter plugins, then figure out how you want to combine those to create a working pipeline.
FWIW note that you can also use TCP for the inbound data, and even use TLS to protect confidentiality/integrity plus mutual client and server certificates for authentication. Also Logstash can't seem to bind to privileged ports like 514 if it's running as an unprivileged user (which it almost certainly should), so you'll probably need to reconfigure your network elements to use a non-standard port regardless.
The other thing we've done, that you might want to look into, is to create a separate pipeline for each type of log (so in your case, maybe a Cisco pipeline, a Juniper pipeline, etc, etc). This seems to have a couple of advantages: (1) it keeps the individual pipeline files small and focused on just that vendor, (2) each pipeline runs independently, so a problem with the one of them won't block the others. What we did was assign a different non-standard port to the input for each pipeline (say 10514 for Cisco, 10515 for Juniper), and that keeps everything neatly separated. I don't know if this is the best way (I only started working with Logstash a couple weeks ago), but it seems to work and the separation has been helpful while debugging. We created a "testing" pipeline that is used when we want to try out changes or start parsing logs from a new vendor without impacting the others. It doesn't even have to send data to Elasticsearch. You can watch check the results in real time or write them to a file to see if you're getting what you want.