Паоло Кастеллини начал карьеру в клубе «Кремонезе» в возрасте 17 лет. В первом же сезоне Паоло в клубе он вылетел в серию С1, затем помог клубу вернуться, но через год ещё раз оказался в третьем итальянском дивизионе. Летом 2000 года Кастеллини перешёл в «Торино», где сразу стал игроком основного состава клуба. 26 августа 2001 года футболист дебютировал в Серии А в матче с «Удинезе», который завершился вничью 2:2. Поло провёл в туринском клубе ещё два с половиной сезона, после чего перешёл в «Брешию» на правах полугодовой аренды.
Летом 2004 года у Кастеллини закончился контракт, и он, в статусе свободного агента, переехал в Испанию, в клуб «Реал Бетис», подписав 5-летний договор. Итальянец планировался как замена ветерана клуба Луиса Фернандеса Гутьерреса, однако молодой футболист не смог вытеснить более опытного из состава. К тому же Паоло долгое время не выступал из-за травмы — разрыва связок в коленном суставе. В результате этого защитник провёл в клубе за два сезона менее 20 игр. 1 ноября 2005 года Кастеллини провёл лучший матч за клуб: благодаря его передаче был забит гол, который принёс севильцам победу над «Челси» в Лиге чемпионов. 24 июня 2006 года «Бетис» разорвал контракт с Паоло
В 2006 году Кастеллини перешёл в «Парму», подписав контракт на 4 года. Футболист сразу стал игроком стартового состава и в сезоне 2008/2009 смог преодолеть отметку в 100 матчей за клуб.
26 августа 2010 года Паоло был арендован клубом «Рома» с приоритетным правом выкупа контракта игрока; римский клуб опередил «Милан», который тоже был заинтересован в футболисте. В составе «джалоросси» футболист планировался как замена Йона Арне Риисе. 11 сентября он дебютировал в составе клуба в матче с «Кальяри», но уже на 13 минуте покинул поле из-за травмы.
Кастеллини выступал за молодёжную сборную Италии. В её составе он участвовал в молодёжном первенстве Европы в 2002 году, где итальянцы дошли до полуфинала.