They both mean the same thing, but they are not interchangeable. Usually, you use "good in" if you're talking about a class, or a field of study or work. You use "at" (or "with") for everything else, usually with a -ing (gerund) verb after it.
"He's good in mathematics."
"He's good in English (class)." = He gets good grades in English class.
"He's good at English." = His English skills are good.
"He's good at tennis."
"He's good at/with talking."
"He's good at/with numbers." = His math skills are good.
"He's good with kids." = Children like him and he feels comfortable with them.
"He's good with people."
I've never thought about the logic behind this grammar before, but it seems that you use "at" when the object is a gerund (-ing), when the object is not a person (numbers, words, etc.), or when the object is singular (tennis, football)--never use "at" with personal objects (people, dogs). You use "with" when the object is a person (kids, people, dogs, etc.). You can usually use "with" with any plural noun. Sometimes they are interchangeable, but not always.
If you don't know which one of these words to use, I think "with" is the safest choice.
At any rate, if you get the prepositions mixed up, you'll still be understood. :)