Some things to try -
If there is no possibility that the two queries (either side of the union) can return duplicates you could make it "union all" which may save a little time.
Apart from that check if the time is in the selects (run them independantly) or the insert.
If the selects - look at indexes on the source tables
If the insert - look at basics like disc config, log on different disc to data, log NOT on raid 5 etc etc.
Mike John