Note that the only performance hits come when you are updating a table with indexes as said indexes must be maintained as the data in the table changes. If you are only selecting from a table, indexes generally can only improve performance and not degrade it. Obviously, you'll want to rid your table of any un-used indexes as they unnecessarily waste disk space and again will have to be maintained as the table changes over time.
Typically you'll want to check your execution plans to see which indexes are actually used based on your queries. Be sure to gather statistics before doing this for accurate results. Doing this check of the execution plan is important, b/c even though you have an index on a column, the optimizer may not choose it based on factors such as cardinality of the column, etc. On large tables where queries are highly selective (i.e. you have 1M users and you're query is where userid = 'x' which will return 1 row), you're going to find the index for the select is worth the cost of maintenance. Small tables, say a table of continent names, will generally not benefit much from an index as many times a full table scan will be preferred over an index scan. This is due to the fact that it will cost more to read the index and then read the data block referenced by the index as opposed to just reading the small amount of data directly. Again, these things will need to be verified based on your specific tables and needs, and it's all done by looking at the execution plans.
Favor concatenated indexes over single column indexes if your queries lend themselves to these types of queries. For example, if your where clauses typically do something like "where emp_fname = 'jim' and emp_lname = 'smith', create one concatenated index on fname and lname instead of individual indexes on each column.