At a purely performance level, it is faster to just insert the data and handle the error, particularly if the error is infrequent. Running a select query to check for a duplicate, processing that result, and then inserting if successful, will be considerably slower than inserting and handling an occasional error. If its raising an exception, then that will be a bit slower since exception handling is slow in most languages, but handling a exception will be many times faster than an SQL query in any language.
As Assaf said, there is also usually a way to explicitly handle duplicates so you might be able to avoid the error altogether. This would increase performance further and allow you to be explicit that you're handling duplicates in a particular way.
Whether or not to use stored procedures is up to you - it can help with performance at the expense of putting more logic in your database. That's a decision you have to make. I've had bad experiences with this, but it depends on the RDBMS and the language you're using.