What you are doing now is safer, though more computationally burdensome, than the photocell idea. After all, your current system will either work or fail. Once you add the photocells, you now have two systems that can fail, either of which will result in the tag not reading. Far easier to fool a photocell than a reader. On the other hand, it will reduce the need.

After hearing your description, I don't think you can really get around polling. I see only two ways to do it, one of which is what you are already thinking about: Have one thread per reader. However, you don't actually have to have multiple timers. You could have one timer, and whenever it ticks, read all the readers. This has a problem, though, in that the computer will be really busy whenever the timer ticks, and will be idle between ticks. A better solution would be to have a timer running at 1/8 the interval you think you need for reading. Whenever it ticks, poll one reader, then next time poll the next reader, and so forth. This will be much more efficient as long as you are willing to wait at least about half a second between polls. Any faster than that and you will probably be exceeding the resolution of the timer.

Using multiple threads would not actually be necessary in the previous scenario. If you have to get your read speed greater than one read every half second, then you would need multiple threads, but you still wouldn't really need more than one timer. Whenever the timer ticked, you'd spawn eight threads. Each thread would poll one machine, and if it saw an RFID, it would read it. Whether those threads would be more efficient than using a single thread is hard to say. The polling and reading steps seem too fast to really benefit from threading.

Technically, you could use multiple timers, but you would only really gain if you could keep the timers out of synch so that not too many timers ticked at the same time.